回溯(画图分析)
class Solution {
public:
vector<string> result;
string path;
vector<string> restoreIpAddresses(string s) {
int n=s.size();
if(n<4||n>12){
return result;
}
backtrack(s,path,0,0,n);
return result;
}
void backtrack(string s,string path,int index,int depth,int n){
if(depth==4){
path.pop_back();//去除最后的点
result.push_back(path);
return;
}
// 3 - depth 表示剩余的 ip 段个数
// n - (3 - depth) * 3 表示剩余的 ip 段如果都是 3 位数,当前 ip 段的结束位置(取不到)
int minI = max(index + 1, n - (3 - depth) * 3);
// n - (3 - depth) * 1 表示剩余的 ip 段如果都是 1 位数,当前 ip 段的结束位置(取不到)
int maxI = min(index + 3, n - (3 - depth));
for (int i = minI; i <= maxI; i++){
string split = s.substr(index, i - index);//字符串截取函数,截取可能的ip
int len = split.size();
if (split.size() > 1 && split[0] == '0') break;
if (stoi(split) <= 255){
backtrack(s,path + (split + '.') , i, depth+1,n);//每段后加一个点最后需要去除一个
}
}
}
};
把数字字符串转换成int输出的函数,atoi和stoi都是只转换字符串的数字部分,遇到其他字符则停止转换。
atoi()的参数是const char*
,因此对于一个字符串str我们必须调用c_str()
的方法把这个string转换成const char*
类型的。
stoi()的参数是const string*
,不需要转化为const char*
;