题目描述
暴力枚举法
vector<string> restoreIpAddresses(string s) {
vector<string> res;
int n=s.length();
for(int i=0;i<3&&i<n-3;++i){
for(int j=i+1;j<i+4&&j<n-2;++j){
for(int k=j+1;k<j+4&&k<n-1;++k){
if(n-1-k>3) continue;
string a=s.substr(0,i+1);
string b=s.substr(i+1,j-i);
string c=s.substr(j+1,k-j);
string d=s.substr(k+1,n-1-k);
if(stoi(a)>255||stoi(b)>255||stoi(c)>255||stoi(d)>255) continue;
if((a.length()>1&&a[0]=='0')||(b.length()>1&&b[0]=='0')||(c.length()>1&&c[0]=='0')||(d.length()>1&&d[0]=='0')) continue;
string temp=a+'.'+b+'.'+c+'.'+d;
res.push_back(temp);
}
}
}
return res;
}
回溯法
class Solution {
private:
vector<string> res;
string s;
string nums;
public:
void dfs(int step,int index){//index表示当前串起始下标,step表示已分出数字数量
if(step==4){
if(index==s.length()) res.push_back(nums);
return;
}
string cur="";
int n=s.length();
for(int i=index;i<index+3&&i<n-3+step;++i){//枚举,这里n写出s.length()会出错?qAq?
cur+=s[i];
string temp=nums;
if(stoi(cur)<=255&&(cur[0]!='0'||cur.length()==1)){
nums+=cur;
if(step<3) nums+='.';
dfs(step+1,i+1);//递归
nums=temp;//复原
}
}
}
vector<string> restoreIpAddresses(string s) {
this->s=s;//类指针->类变量
dfs(0,0);
return res;
}
};