题目链接:https://leetcode-cn.com/problems/restore-ip-addresses/
题目如下:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
if(s.size()>12) return result;//特判
backtracking(s,0,0);
return result;
}
//startIndex必须有,因为不能重复分割,记录下一层递归分割的起始位置
//pointNum,用于记录添加逗点的数量
//注:题目要求,分为四段,则以传统的以字符长度作为跳出递归的条件不符合题意,应该以分的段数作为条件判断是否退出递归
void backtracking(string s,int startIndex,int pointNum){
if(pointNum==3){
if(isVaild(s,startIndex,s.size()-1)){//判断第四段子字符串是否合法,若合法则放入
result.push_back(s);
}
return ;
}
for(int i=startIndex;i<s.size();i++){
if(isVaild(s,startIndex,i)){//判断区间内的子串是否合法
s.insert(s.begin()+i+1,'.');//在i的后面加入一个逗点
pointNum++;
backtracking(s,i+2,pointNum);
pointNum--;
s.erase(s.begin()+i+1);
}else break;//不合法,则直接结束本层循环
}
}
//判断是否为一个有效段位
bool isVaild(string s,int l,int r){
if(l>r){
return false;
}
if(s[l]=='0'&&l!=r){//不能以0为开头的数字
return false;
}
int num=0;
for(int i=l;i<=r;i++){
if(!isdigit(s[i])){//如果不是数字字符
return false;
}
num=num*10+s[i]-'0';
if(num>255){//不能大于255
return false;
}
}
return true;
}
private:
vector<string> result;
string path;
};