题意:
        现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。    
        例如:
                给出的字符串为"25525522135",
                返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)

方法:
递归回溯

思路:
        提示:做回溯题时,应该将树的图解画出,再写代码。                


按如上图示递归回溯。
横向代表循环,纵向代表递归。

注意点:要消除前缀0,每段的IP值范围是[0,255]。


class Solution {
public:
    vector<string> res;
    
    vector<string> restoreIpAddresses(string s) {
        dfs(s,0,"",0);//递归
        return res;
    }
    
    void dfs(string s,int st,string v,int cur){//递归
        int len=s.size();
        if(cur==3){
            if(s.substr(st).size()==0)//如果第四段长度为0.则return
                return;
            if(s.substr(st).size()>1&&s[st]=='0')//如果第四段含有前缀0.则return
                return;
            int x=0;
            for(int i=st;i<len;i++){
                x=x*10+s[i]-'0';
            }
            if(x<=255){//如果第四段的值小于等于255,才加入结果
                v+=s.substr(st);
                res.push_back(v);
                cout << v << endl;
            }
            return;
        }
        
        int x=0;
        for(int i=st;i<len;i++){//循环遍历
            //消除前缀0
            if(i==st&&s[i]=='0'){//如果某段的第一位为0,则直接递归并且之后break
                string t="0.";
                dfs(s,i+1,v+t,cur+1);
                break;
            }else{
                x=x*10+s[i]-'0';
                if(x<=255){//值小于等于255才递归
                    string t=to_string(x)+".";
                    dfs(s,i+1,v+t,cur+1);
                }
            }
            
        }
    }
};


时间复杂度:
空间复杂度: