回溯法

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return string字符串vector
     */
    bool judge(string str){  //判断地址中的单元是否合法
        if(str.size()==0) return false;
        if(str[0]=='0'&&str.size()>1) return false;
        int res=0,num=0;
        for(int i=0;i<str.size();i++){
            res=res*10+(str[i]-'0');
        }
        if(res>255) return false;
        return true;
    }
    void help(vector<string> &res,string str,string s,int start,int num){
        if(start==s.size()&&num==4){ //如果遍历完了字符串,并且有4个合法单元,就加入res
            //cout<<str<<endl;
            str.pop_back();
            res.push_back(str);
            return ;
        }
       for(int i=1;i<=3&&start+i<=s.size();i++){  //模拟单元字符串的长度
            string temp=s.substr(start,i);
            if(judge(temp)&&num<4){
                str+=temp;
                str.push_back('.');
                help(res,str,s,start+i,num+1);
                for(int j=0;j<=i;j++) str.pop_back(); //回溯
            }
        }
        return ;
    }
    vector<string> restoreIpAddresses(string s) {
        // write code here
        vector<string> res;
        string str;
        help(res,str,s,0,0);
        return res;
    }
};