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)
第一种方法:
三重循环,遍历三个小数点的位置,对每个位置检查一下是否满足条件。
class Solution {
public:
bool isvalid(string ip)
{
int value=atoi(ip.c_str());
if(ip[0]=='0')
{
return ip.size()==1;
}
else
{
if(value<=255)
return true;
else
return false;
}
}
vector<string> restoreIpAddresses(string s)
{
vector<string>ret;
if(s.size()>12||s.size()<4)
return ret;
int i,j,k;
string ip1,ip2,ip3,ip4;
for(i=0;i<3&&i<s.size();i++)
for(j=i+1;j<i+4&&j<s.size();j++)
for(k=j+1;k<j+4&&k<s.size();k++)
{
ip1=s.substr(0,i+1);
ip2=s.substr(i+1,j-i);
ip3=s.substr(j+1,k-j);
ip4=s.substr(k+1);
if(isvalid(ip1)&&isvalid(ip2)&&isvalid(ip3)&&isvalid(ip4))
{
string temp=ip1+'.'+ip2+'.'+ip3+'.'+ip4;
ret.push_back(temp);
}
}
return ret;
}
};
第二种方法:回溯法,用一个count计数,满足条件则添加到结果中
class Solution {
public:
void helper(string s,int count,vector<string>&ip_ret,vector<string> &temp)
{
if(count==3)
{
if(s.size()==0||s.size()>3||(s.size()>1&&s[0]=='0'))
return;
int value=atoi(s.c_str());
if(value>255)
return;
else
{
string ip;
for(int j=0;j<3;j++)
ip.append(temp[j]).append(".");
ip.append(s);
ip_ret.push_back(ip);
}
}
else
{
int i;
for(i=1;i<4&&i<s.length();i++)
{
string ip_child=s.substr(0,i);
if(i>1&&s[0]=='0')
break;
int val=atoi(ip_child.c_str());
if(val>=0&&val<=255)
{
temp.push_back(ip_child);
helper(s.substr(i),count+1,ip_ret,temp);
temp.pop_back();
}
}
}
}
vector<string> restoreIpAddresses(string s)
{
vector<string>ip_ret;
vector<string>temp;
helper(s,0,ip_ret,temp);
return ip_ret;
}
};
class Solution {
public:
void helper(string s,int start,int count,vector<string>&ip_ret,vector<string> &temp)
{
if(count==4)
{
if(start==s.size())
{
string ip;
for(int j=0;j<3;j++)
ip.append(temp[j]).append(".");
ip.append(temp[3]);
ip_ret.push_back(ip);
}
return;
}
else
{
for(int i=start;i<start+4&&i<s.length();i++)
{
if(i>start&&s[start]=='0')
break;
string ip_child=s.substr(start,i-start+1);
int val=atoi(ip_child.c_str());
if(val>=0&&val<=255)
{
temp.push_back(ip_child);
helper(s,i+1,count+1,ip_ret,temp);
temp.pop_back();
}
}
}
}
vector<string> restoreIpAddresses(string s)
{
vector<string>ip_ret;
vector<string>temp;
helper(s,0,0,ip_ret,temp);
return ip_ret;
}
};