题目描述:
给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。
样例:
给出字符串 “25525511135”,所有可能的IP地址为:
[
“255.255.11.135”,
“255.255.111.35”
]
(顺序无关紧要)
思路讲解:
首先我们说一下ip地址的范围:0.0.0.0—-255.255.255.255,所以我们需要将这个字符串分为四段,而且每一段都要在0-255之间,故我们每一次都是取字符串的位数是1-3,我的思路是取三次,然后字符串剩下的作为第四次,但是这里我们需要注意两个点就是,ip地址中不存在010这样的,即如果首字符是0,那么其后面不能再跟其他的了,第二个就是我们需要判断,是否能取不到我们想要的长度的子字符串,基本上就是这样的问题吧,这里我们可以使用循环三次的方法,也可以使用深度搜索,这里我用的是深度搜索(递归)。
代码详解:
class Solution {
public:
/*
* @param s: the IP string
* @return: All possible valid IP addresses
*/
vector<string> restoreIpAddresses(string &s) {
// write your code here
vector<string>res;
string cur="";
restore(s,0,0,res,cur);
//printstring(res);
return res;
}
void restore(string s,int index,int count,vector<string>&res,string cur)
{
if(count==3){//ip地址有四段,故我们判断其已经有了三段,那么我们就将剩下的最为第四段
int leave_len=s.length()-index;
if(leave_len>0){
string str=s.substr(index,leave_len);
if(str[0]=='0'&&str.length()>1){//如果子字符串首字母是0,那么他就只能是0,后面不能添加任何数字了
return;
}else{
int tmp=atoi(str.c_str());
if(tmp<=255&&tmp>=0){
res.push_back(cur+str);
return;
}
}
}
}
for(int i=1;i<=3;i++){//由于最多是ip(0-255)每一个最多是三位数
int leave_len=s.length()-index;
if(i<leave_len){//判断剩余的长度是否满足需要截取的长度
string str=s.substr(index,i);
int tmp=atoi(str.c_str());
if(str[0]=='0'&&str.length()>1){
return;
}else{
if(tmp<=255&&tmp>=0){
str=str+".";
restore(s,index+i,count+1,res,cur+str);
}
}
}
}
}
void printstring(vector<string>res)
{
for(int i=0;i<res.size();i++){
cout<<res[i]<<" ";
}
cout<<endl;
}
};