93.复原ip地址
思路:回溯
将过程看作向字符串中添加三个".“,并枚举三个”."出现的位置
需要一个pointNum记录已经添加的点的数量,如果已经有三个点,就判断剩余部分是否合法,合法就加入结果集
需要一个start记录当前开始的起点,通过枚举i来遍历start到i的长度
需要一个判断当前部分是否合法的函数:
1.前导零不合法
2.非数字字符不合法
3.大于255不合法
递归终止条件:有三个点且有剩余部分 且剩余部分合法加入结果集
class Solution {
public:
vector<string> res;
vector<string> restoreIpAddresses(string s) {
backtrack(0,0,s);
return res;
}
void backtrack(int start,int pointNum,string s){
if(pointNum==3){
if(isValid(s.substr(start)) && start<s.size()){//start<s.size()避免刚好三组+.就结束
res.push_back(s);
}
return;
}
if(start>s.size()) return;
for(int i=start;i<s.size();i++){
string tmp=s.substr(start,i-start+1);
if(isValid(tmp)){
s.insert(s.begin()+i+1,'.');//在i后面插入
pointNum++;
backtrack(i+2,pointNum,s); //i+1现在是'.'的位置
pointNum--;
s.erase(s.begin()+i+1); //回溯删掉'.'
}else{
break;
}
}
}
bool isValid(string s){
if(s[0]=='0'&&s.size()>1) return false;
int num=0;
for(int i=0;i<s.size();i++){
if(s[i]<'0' || s[i]>'9') return false;
num=10*num+(s[i]-'0');
if(num>255) return false;
}
return true;
}
};