题目描述:

方法1:回溯,全部在原字符串处理,即backtrack参数一直是原字符串,len表示起始位置

class Solution {
public:
    vector<string> result;
    vector<string> data;
    bool judge(string s){//判断是否含有前导0,是否大于255
        if(s.size()>1 && s[0] == '0' || stoi(s) > 255) return false;
        return true;
    }
    void backtrack(string s,int len){
        if(data.size() == 4 && len == s.size()){//data的长度一定要4
            string s1 = "";
            for(int i=0;i<3;i++){
                s1 = s1 + data[i];
                s1 = s1 + ".";
            }
            s1 = s1 + data[3];
            result.push_back(s1);
            return;
        }
        if(len == s.size() || data.size() == 4) return;//只是长度符合或者只有data的长度为4

        for(int i=1;i<=3;i++){
            string s1 = s.substr(0+len,i);
            if(judge (s1)){
                data.push_back(s1);
                len += s1.size();
                backtrack(s,len);
                len -= s1.size();//出错
                data.pop_back();
            }
            else continue;
        }

    }
    vector<string> restoreIpAddresses(string s) {
        backtrack(s,0);
        return result;
    }
};

出现错误,应该是for(int i=1;i<=3 && len + i <= s.size();i++),如果没有len + i <= s.size()这一条件,string s1 = s.substr(0+len,i)可能会对data[3] 取多次(len + i 超出长度只会取到末尾不会报错)

for(int i=1;i<=3;i++)

应该是

解决办法

class Solution {
public:
    vector<string> result;
    vector<string> data;
    bool judge(string s){//判断是否含有前导0,是否大于255
        if(s.size()>1 && s[0] == '0' || stoi(s) > 255) return false;
        return true;
    }
    void backtrack(string s,int len){
        if(data.size() == 4 && len == s.size()){//data的长度一定要4
            string s1 = "";
            for(int i=0;i<3;i++){
                s1 = s1 + data[i];
                s1 = s1 + ".";
            }
            s1 = s1 + data[3];
            result.push_back(s1);
            return;
        }
        if(len == s.size() || data.size() == 4) return;//只是长度符合或者只有data的长度为4

        for(int i=1;i<=3 && len + i <= s.size();i++){
            string s1 = s.substr(0+len,i);
            if(judge (s1)){
                data.push_back(s1);
                backtrack(s,len + s1.size());
                data.pop_back();
            }
            else continue;
        }

    }
    vector<string> restoreIpAddresses(string s) {
        backtrack(s,0);
        return result;
    }
};

或者,backtrack参数为切割后的字符串,len只有记录长度判断是否递归结束这一个作用

class Solution {
public:
    vector<string> result;
    vector<string> data;
    int slength;

    bool judge(string s){//判断是否含有前导0,是否大于255
        if(s.size()>1 && s[0] == '0' || stoi(s) > 255) return false;
        return true;
    }

    void backtrack(string s,int len){
        if(data.size() == 4 && len == slength){//遍历结束且data的长度一定要4
            string s1 = "";
            for(int i=0;i<3;i++){
                s1 = s1 + data[i];
                s1 = s1 + ".";
            }
            s1 = s1 + data[3];
            result.push_back(s1);
            return;
        }

        if(len == slength || data.size() == 4) return;//只是长度符合或者只有data的长度为4

        for(int i=1;i<=3 && i <= s.length();i++){
            string s1 = s.substr(0,i);
            if(judge (s1)){
                data.push_back(s1);
                len += s1.size();
                backtrack(s.substr(i),len);
                len -= s1.size();
                data.pop_back();
            }
            else continue;
        }

    }
    vector<string> restoreIpAddresses(string s) {
        slength = s.size();
        backtrack(s,0);
        return result;
    }
};