回溯问题。
这道题的重点在于退出递归的条件,有:
- 扫描的迭代器大于字符串长度;
- 递归次数大于3;
- 开头是0并且后面还有数字;
- 截取的字符串数字大于255.
然后如果满足这些条件,就要判断是否要添加”.”或者是否次数等于3,把它push进result中。
最后,要按照之选一个数字,选两个数字,选三个数字的递归方式找全所有种可能(毕竟如果找4个数字的话,它肯定大于255了)。
C++代码:
class Solution {
public:
/**
* @param s the IP string
* @return All possible valid IP addresses
*/
vector<string> restoreIpAddresses(string& s) {
int len = s.size();
vector<string> result;
if (len == 0){
return result;
}
string temp ="";
process(result, s, temp, 0, 1, 0);
process(result, s, temp, 0, 2, 0);
process(result, s, temp, 0, 3, 0);
return result;
}
void process(vector<string>& result, string &s,string temp, int start, int end, int time) {
if (end > s.size()) {
return;
}
if (time >3) {
return;
}
string sub = s.substr(start,end-start);
if (sub[0] == '0' && sub.size()>1){
return ;
}
if (atoi(sub.c_str()) > 255){
return;
}else {
temp += (sub);
if (end!=s.size()) {
temp +=".";
} else {
if (time == 3) {
result.push_back(temp);
return;
}
}
}
process(result,s,temp,end,end+1,time+1);
process(result,s,temp,end,end+2,time+1);
process(result,s,temp,end,end+3,time+1);
}
};