给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。
示例 1:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
示例 2:
输入:s = “0000”
输出:[“0.0.0.0”]
提示:
0 <= s.length <= 3000
s 仅由数字组成
解题思路:
我理解这是一个回溯,只需要处理好每一次的整数即可。
比如:
1. 每段不超过255
2. 遇到0开头就不需要再回溯了,直接走下去
3. 字符串长度不应该小于4或者大于12,因为在大于12的情况下无论如何都不可能是有效的分段。
class Solution {
public:
void split(string s ,int cur,vector<string> &ret,string temp,int num)
{
string s_str;
string old= temp;
int temp_num = 0;
int i = 0;
if(num==1)
{
s_str = s.substr(cur,s.size()-cur);
temp_num = stoi(s_str);
//遇到"010"这种,是不行的
if(temp_num!=0 && s_str[0]=='0')
return;
//遇到"000"这种也是不行的
if(temp_num==0 && (s.size()-cur)>1)
return;
if(temp_num>255)
return ;
temp+=to_string(stoi(s_str));
ret.push_back(temp);
return ;
}
num--;
temp_num = 0;
while(temp_num<=255 && (cur+i)<s.size())
{
s_str = s.substr(cur,++i);
temp_num = stoi(s_str);
//遇到"010"这种也是不行的
if(temp_num!=0 && s_str[0]=='0')
return;
if(temp_num<=255)
{
temp+=to_string(temp_num);
temp+=".";
if((cur+i)<s.size())
split(s,cur+i,ret,temp,num);
else
return ;
}
if(temp_num==0)
return ;
temp=old;
}
}
vector<string> restoreIpAddresses(string s) {
if(s.size()<4||s.size()>12) return vector<string> {};
vector<string> ret;
string temp;
split(s,0,ret,temp,4);
return ret;
}
};