题目大意:给出一个数字组成的字符串,问他能恢复成多少种的ip地址,列举出来
分析:回溯法。罗列想到回溯。递归结束条件就是字符串遍历结束并且生成四段,然后有个剪枝条件。接下来递归就分三种情况:每段有1个数字;每段有2个数字;每段有3个数字,根据三种情况处理细节判断即可。
代码:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> result;
string path;
helper(s, 0, 0, path, result);
return result;
}
void helper(string &s, int num, int pos, string path, vector<string>& result) {
if (pos == s.size() && num == 4) { //只有遍历完s并且生成了4段时才有一个答案
result.push_back(path.substr(0, path.size() - 1)); //这里需要去除掉path最后的.
return;
}
if (s.size() - pos > 3 * (4 - num)) //剪枝(剩余数字个数大于剩余段数*3时)
return; //此时无法生成合法ip地址
if (pos < s.size()) { //第一种情况,该段只有一个数字
helper(s, num + 1, pos + 1, path + s.substr(pos, 1) + ".", result);
}
if (pos < s.size() - 1 && s[pos] != '0') { //该段含有两个字符,并且第一个字符不能是'0'
helper(s, num + 1, pos + 2, path + s.substr(pos, 2) + ".", result);
}
//该段含有3个字符,第一个字符不能是'0',且该段不能大于"255"
if (pos < s.size() - 2 && s[pos] != '0' && s.substr(pos, 3) <= "255") {
helper(s, num + 1, pos + 3, path + s.substr(pos, 3) + ".", result);
}
}
};