题干:
代码:
class Solution {
public:
vector<string> res;
void backtracking(string &s, int start, int pointNum){
if(pointNum == 3){
if(isvalid(s, start, s.size()-1)){
res.push_back(s);
}
return;
}
for(int i = start; i < s.size(); i++){
if(isvalid(s, start, i)){
s.insert(s.begin() + i + 1, '.');
pointNum++;
backtracking(s, i + 2, pointNum);
s.erase(s.begin() + i + 1);
pointNum--;
}else break;//如果出现不合法数字,整层终止,不是continue
}
}
bool isvalid(string s, int start, int end){
if(start > end)return false;
if(s[start] == '0' && start != end)return false;//允许0单独存在但是绝对不能以0开头
int sum = 0;
for(int i = start; i <= end; i++){
if(s[i] > '9' || s[i] < '0')return false;
sum = sum * 10 + (s[i] - '0');
if(sum > 255)return false;
}
return true;
}
vector<string> restoreIpAddresses(string s) {
backtracking(s, 0, 0);
return res;
}
};
IP地址最多四段,所以利用插入点数为3作为终止条件。
insert与erase传入的是迭代器参数。
在isvalid函数中如果少了 if(start > end) return false; 的话会出现以下报错:
从前向后扫描字符串算数字总和:
int sum = 0;
for(int i = start; i <= end; i++){
sum = sum * 10 + (s[i] - '0');
}