Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135",
return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)
这个题使用递归的方法,具体做的时候还是比较麻烦的,为了简化递归的条件,我设置了check函数,处理当前地址段是否符合规范,这样也能规避‘0’的处理。在递归调用过程,设置pos数组,记录每个’.’号的位置,在满足递归条件后,再重组addr字符串,并添加到addr中,为了进一步压缩运行时间,递归过程首先判断后续的字符串长度是否在规定长度内,不满足条件的直接舍弃。代码如下:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> result;
vector<int> pos(4,0);
find(0,0,s,pos,result);
return result;
}
void find(int start, int deep, string &s,vector<int> &pos, vector<string> &result){
if(s.size()-start>(4-deep)*3||s.size()-start<4-deep) //剩余长度过长或过短直接舍弃该结果
return;
if(deep==4 && start==s.size()){
int beg=0;
string addr;
for(int i=0;i<4;i++){ //重组ip地址
string ip(s,beg,pos[i]-beg+1);
beg=pos[i]+1;
addr+=i==0?ip:'.'+ip;
}
result.push_back(addr);
}
for(int i=start;i<s.size();i++){
if(check(start,i,s)){
pos[deep]=i; //记录'.'位置
find(i+1,deep+1,s,pos,result);
}
}
}
bool check(int start,int index,string &s){ //只需判断当前ip段是否在0~255的范围内即可
string ip(s,start,index-start+1);
if(ip.size()==1)
return "0"<=ip && ip<="9";
else if(ip.size()==2)
return "10"<=ip && ip<="99";
else if(ip.size()==3)
return "100"<=ip && ip<="255";
else
return false;
}
};