目录
1.暴力
为了求到有效的ip地址,我们需要将字符串分割成四个部分,也就是向整个字符串插三个点。
我们直接暴力一下,然后分割出四个数,若有下面几种情况,则直接丢弃:
如果存在一个数大于255
如果存在一个数不是一位的,第一个数是0
代码如下所示:
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串vector
*/
vector<string> restoreIpAddresses(string s) {
string tmp;
vector<string> res;
int n=s.size();
for(int i=1;i<4 && i<n-2;++i){
for(int j=i+1;j<i+4 && j<n-1;++j){
for(int k=j+1;k<j+4 && k<n;++k){
string a=s.substr(0, i);
string b=s.substr(i, j-i);
string c=s.substr(j, k-j);
string d=s.substr(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;
tmp=a+'.'+b+'.'+c+'.'+d;
res.push_back(tmp);
}
}
}
return res;
}
};
2.递归
思路如下图所示:
就是一遍深搜,每次只能搜最多3个数字,只有走到最后才能放到答案里面。
这里设置一个step代表搜的数字个数,直到搜到了第四个数字并且索引已经到达字符串最后的后一位才形成地址。
代码如下所示:
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串vector
*/
void dfs(vector<string> &res, string &s, string ip, int step, int index){
string cur="";
if(step==4){
if(index!=s.length()){
return;
}
res.push_back(ip);
}else{
for(int i=index;i<index+3 && i<s.length();++i){
cur+=s[i];
int num=stoi(cur);
//由于每次都会改变ip 所以需要保存最开始的ip
string tmp=ip;
if(num<=255 && (cur.length()==1 || cur[0]!='0')){
if(step!=3){
ip+=cur+".";
}else{
ip+=cur;
}
cout<<ip<<endl;
dfs(res,s,ip,step+1,i+1);
ip=tmp;
}
}
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> res;
string ip;
dfs(res,s,ip,0,0);
return res;
}
};