给出一个只包含数字的字符串,找出它所有可能的合法的IP地址。
比如给出 "25525511135",
那么就返回 ["255.255.11.135","255.255.111.35"]
解题的思路考虑的是backtrack回溯法,首先要有一个valid函数判断当前纳入的字符串是否符合ip的规范0-255之间,如果符合,继续寻找下一个,如果不符合的话,就需要返回到上一次的结果,再尝试另外的可能性。
vector<string> restoreIpAddresses(string s) {
vector<string> result;
int len = s.length();
if(index >= len)
return;
if(len > 12 || len < 4) return result;
string tmp = "";
// start from the first one
int num = 1;
restore(s,0,num,result,tmp);
}
void restore(string s, int index, int num, vector<string>& result,string tmp)
{
int len = s.length();
if(num >= 4)
{
if(len - index <= 3 && len - index > 0)
{
int k = len - index;
if(valid(s.substr(index,k)))
{
tmp += s.substr(index,k);
result.push_back(tmp);
}
}
else return;
}
else{
tmp += s.substr(index,1);//单个数字的情况
tmp += '.';
restore(s,index+1,num+1,result,tmp);
tmp = tmp.substr(0,tmp.length()-2);
if(s[index] != '0'){//两个数字
tmp += s.substr(index,2);
tmp += '.';
restore(s,index+2,num+1,result,tmp);
}
tmp = tmp.substr(0,tmp.length()-3);
string tmp1 = s.substr(index,3);//三个数字
if(tmp1.length() == 3 && valid(tmp1))
{
tmp += s.substr(index,3);
tmp += '.';
restore(s,index+3,num+1,result,tmp);
tmp = tmp.substr(0,tmp.length()-4);
}
}
}
bool valid(string s)
{
if(s.length() == 2)
{
if(s[0] == '0')
return false;
else return true;
}
if(s.length() == 1)
return true;
int num = 0;
for(int i = 0 ; i < 3; i++)
num += (s[i] - '0')*pow(10,2-i);
if(num <= 255 && num >= 100)
return true;
return false;
}