题目描述:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
方法1:
主要思路:
(1)直观的回溯加分类讨论;
class Solution {
public:
void helper(string& s,vector<string>& res,string tmp,int start,int count){
//若是已经分割了四份或大小越界了,则直接返回
if(count==4||start>=s.size()){
return;
}
++count;//统计分割的份数
//没份最多3个数字
for(int i=1;i<=3;++i){
//若是现在是第四份,但大小大于3,则肯定不满足
if(count==4&&(s.size()>start+3)){
return;
}
//若当前是第四份,大小满足了
if(count==4){
//判断转化成的数字的大小是否满足小于255
if(stoi(s.substr(start))>255){
return;
}
else{
//然后判断转化后的数字的可能的有效性,既不能最高位为0但值不为0
string str_tmp=s.substr(start);
if(str_tmp[0]=='0'&&str_tmp.size()>1){
return;
}
//否则就是满足要求的一种解析,存储到结果中
tmp+=str_tmp;
res.push_back(tmp);
return;
}
}
//若当前要分的字符数量已经为3个,则判断和255的大小
if(i==3){
//若满足大小要求,且数值有效,则接着遍历
if(stoi(s.substr(start,3))<=255){
string str_tmp=s.substr(start,3)+'.';
if(str_tmp[0]=='0'&&str_tmp.size()>2){
return;
}
tmp+=str_tmp;
}
else{
return;
}
}
else{
//若不是要分的三位数,则只需判断当前的数字有效性,既最高位为0但数值不为0
string str_tmp=s.substr(start,i)+'.';
if(str_tmp[0]=='0'&&str_tmp.size()>2){
return;
}
tmp+=str_tmp;
}
//递归
helper(s,res,tmp,start+i,count);
//回溯
tmp.erase(tmp.begin()+start+count-1,tmp.end());
}
//--count;
}
vector<string> restoreIpAddresses(string s) {
if(s.size()<4){
return vector<string>();
}
string tmp;
vector<string> res;
helper(s,res,tmp,0,0);
return res;
}
};