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)
方法一:暴力破解法
写代码时没有思虑周全,一开始忘了对每个字段进行判断小于255,之后调试发现,需要处理当数字位数大于1但以0为开头的情况。
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> result;
int len = s.length();
int a,b,c,d;
for(a=1;a<=3;a++)
for(b=1;b<=3;b++)
for(c=1;c<=3;c++)
for(d=1;d<=3;d++)
{
if(a+b+c+d == len)
{
string strA = s.substr(0,a);
string strB = s.substr(a,b);
string strC = s.substr(a+b,c);
string strD = s.substr(a+b+c,d);
int IntA = stoi(s.substr(0,a));
int IntB = stoi(s.substr(a,b));
int IntC = stoi(s.substr(a+b,c));
int IntD = stoi(s.substr(a+b+c,d));
if(IntA <= 255 && IntB <= 255 && IntC <= 255 && IntD <= 255)
{
if((a != 1 && strA[0] == '0') || (b != 1 && strB[0] == '0') || (c != 1 && strC[0] == '0')
|| (d != 1 && strD[0] == '0'))
continue;
else
{
string temp = strA +'.'+ strB+'.' + strC+'.' + strD;
result.push_back(temp);
}
}
}
}
return result;
}
};
方法二:递归方法
restore函数中的result需要加引用,不然只会是拷贝,找这个bug蛋疼了蛮久 - -
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> result;
restore(s,result,0,0,"");
return result;
}
void restore(string s,vector<string>& result,int idx,int count,string restored)
{
if(count > 4) return;
if(count == 4 && idx == s.length())
result.push_back(restored);
for(int i=1;i<4;i++)
{
if(idx+i > s.length()) break;
string temp = s.substr(idx,i);
if(stoi(temp) > 255) continue;
if(i > 1 && temp[0] == '0') continue;
restore(s,result,idx+i,count+1,restored+temp+(count==3?"":"."));
}
}
};