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)
用归并做的,一次把当前串分成两个,继续递归,最后合并。代码如下:
bool valid(string s){
int n=s.length(),temp=0;
if(n>3)return false;
if(n>1&&s[0]=='0')return false;
for(int i=0;i<n;i++){
temp=temp*10+s[i]-'0';
}
if(n==3&&temp>255)return false;
return true;
}
vector<string> make(string s,int k){
vector<string> result;
string temp="";
if(k==1){
if(!valid(s))return result;
result.push_back(s);
return result;
}
else{
int n=s.length();
for(int i=0;i<n-1;i++){
if(i>3*k/2-1||n-1-i>3*k/2)continue;
vector<string> left=make(s.substr(0,i+1),k/2);
vector<string> right=make(s.substr(i+1,n-i-1),k/2);
if(left.size()==0||right.size()==0)continue;;
for(int j=0;j<left.size();j++){
for(int k=0;k<right.size();k++){
temp=left[j]+"."+right[k];
result.push_back(temp);
}
}
}
return result;
}
}
vector<string> restoreIpAddresses(string s) {
return make(s,4);
}
还有一种方法就是DFS,leetcode上的结果要比上面的归并(4ms)好一些(0ms),代码如下:
bool valid(string s){
int n=s.length();
if(n>3)return false;
if(s[0]=='0'&&n>1)return false;
int temp=0;
for(int i=0;i<n;i++){
temp=temp*10+s[i]-'0';
}
if(temp>255)return false;
return true;
}
void dfs(vector<string> &result,vector<string> &temp,string s,int k){
int len=s.length();
if(k==3){
if(valid(s)){
temp[k]=s;
string res=temp[0]+"."+temp[1]+"."+temp[2]+"."+temp[3];
result.push_back(res);
}
}
else{
for(int i=0;i<3&&i<len+k-3;i++){
if(valid(s.substr(0,i+1))&&(len-i-1)>=(3-k)&&(len-1-i)<=3*(3-k)){
temp[k]=s.substr(0,i+1);
dfs(result,temp,s.substr(i+1,len-i-1),k+1);
}
}
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> result;
vector<string> temp(4,"111");
dfs(result,temp,s,0);
return result;
}