题目描述:
方法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;
}
};