给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
思路:
回溯法,加一堆条件去判断符合ip地址格式的值,没想到用atoi时候还有个溢出的问题,所以要加上一个位数的判断,具体实现如下,写得有点烂T o T。
class Solution {
public:
vector<string> res;
vector<string> restoreIpAddresses(string s) {
if(s.empty())
{
return res;
}
findip(s,1,0,"");
return res;
}
void findip(string s,int count,int now,string currstr)
{
if(count==4)
{
if(s[now]=='0'&&now+1<s.size())
{
return;
}
string str="";
for(int i=now;i<s.size();i++)
{
str+=s[i];
}
if(str.size()>3)
{
return;
}
int num=atoi(str.c_str());
if(num<=255)
{
currstr+=str;
res.push_back(currstr);
}
return;
}
if(s[now]>'2')
{
if(now+1<s.size())
{
findip(s,count+1,now+1,currstr+s[now]+".");
}
if(now+2<s.size())
{
findip(s,count+1,now+2,currstr+s[now]+s[now+1]+".");
}
}
else if(s[now]=='0')
{
if(now+1<s.size())
{
findip(s,count+1,now+1,currstr+s[now]+".");
}
}
else
{
if(now+1<s.size())
{
findip(s,count+1,now+1,currstr+s[now]+".");
}
if(now+2<s.size())
{
findip(s,count+1,now+2,currstr+s[now]+s[now+1]+".");
}
if(now+3<s.size())
{
string str="";
for(int i=0;i<3;i++)
{
str+=s[now+i];
}
int num=atoi(str.c_str());
if(num<=255)
{
findip(s,count+1,now+3,currstr+s[now]+s[now+1]+s[now+2]+".");
}
}
}
}
};
网友评论