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)
对于递归回溯一直都比较生疏,这道题其实就是一个深度优先遍历的过程。IP有4个段,每个段的字符个数可能是1,2,3,因此对每一段循环取1,2,3,然后标记当前是对应的IP段的哪个段,直到IP端已经分为4个段并且取完了string这个时候取到一个合法的ip放入最后的结果中。对每次处理的时候如果按照每次取i个字符处理之后,调用递归取后面的段之后需要把前面的取i得到的字符串去掉,因为如果这里取的满足条件那么后面一定已经存放到结果中。现在需要新起一个开头处理。
class Solution {
public:
bool validIP(string digit)
{
int n = digit.size();
if(n>1)
{
if(digit[0] == '0')
return false;
}
const char *chara = digit.c_str();
int num = atoi(chara);
if(num>=0 && num<=255)
return true;
else
return false;
}
void getIP(string &s,int start,int drag,string &mid,vector<string> &result)
{
if(drag == 4)
{
//cout<<mid<<endl;
if(start == s.size() && mid != "")
{
result.push_back(mid.substr(0,mid.size()-1));
mid = "";
}
return;
}
for(int k=1;k<=3 && start+k-1<s.size();k++)
{
string temp = s.substr(start,k);
if(validIP(temp))
{
string m = mid;
mid += temp +'.';
getIP(s,start+k,drag+1,mid,result);
mid = m;
}
}
return;
}
vector<string> restoreIpAddresses(string s) {
int len = s.size();
vector<string> result;
if(len>12 || len<4) return result;
string mid;
getIP(s,0,0,mid,result);
return result;
}
};