题目93:
1.解题思路
首先看到该题,第一反应是dfs+回溯,第二反应就是可不可以用动规。第三反应就是暴力求解:反正就是4~12个数,往里面插入点,分为三坨;复杂度也应该不是很高;
直接循环提交后会发现特殊情况:‘010010’的处理;‘00’要写成‘0’,‘010’是不合理的;
还需要额外处理这两个额外情况;
初步反应两个方法:
- 对处理后的string进行修正,再加一个修补函数,所要处理的问题,就是“删掉字符串中的’010’类型和将‘00’等多个0的情景减少为1个0"
- string -> int -> string 后的不同进行比较;
010 -> 10 -> 10
000 -> 0 ->0
那么此时的check函数就非常多余了,本来就没实现什么大的功能,这里可以将方法2添加进函数check里面;
vector<string> restoreIpAddresses(string s) {
vector<string> res;
if(s.size()==0)
return res;
string a, b, c, d;
for(int i=1;i<=3;i++)
{
a = s.substr(0, i);
a= to_string(stoi(a));
if(!check(a) ) //如果割除来的数不合理 i++
continue;
for(int j = 1;i+j<s.size() && j<=3;j++)
{
b = s.substr(i, j);
b= to_string(stoi(b));
if(!check(b)) //如果割除来的数不合理 i++
continue;
for(int m=1;i+j+m<s.size() && m<=3 ;m++)
{
c = s.substr(i + j, m);
c= to_string(stoi(c));
if(!check(c)) //如果割除来的数不合理 i++
continue;
if(i+j+m +3>=s.size()) //检查剩余的
{
d = s.substr(i+j+m,s.size()-(i+j+m));
d= to_string(stoi(d));
if(!check(d)) //如果割除来的数不合理 i++
continue;
string temp = a + '.' + b + '.' + c + '.' + d;
if(temp.size()==s.size()+3){
//temp = temp.insert(n,1,'.');
res.push_back(temp);
}
}
}
}
}
return res;
}
bool check(string s) //s分num坨
{
if(s.size()==0)
return true;
if(stoi(s) >255 || stoi(s) < 0)
return false;
return true;
}