这种带有回溯问题感觉有一种递归解决问题的范式,以此题为例写出自己的题解,自娱自乐,提神醒脑
题目叙述
xx 给定一个只包含数字的ip地址的字符串,返回所有可能合法的ip地址,例如,输入”25525511135”,程序应该返回: [“255.255.11.135”, “255.255.111.35”].
分析
假如当前的状态已经提取了前边的几个数字组成 No 组ip地址(总共四组),那么下一组可能有接下来连续的一个数,两个数,三个数组成一组.下面列出三种情况下继续向下遍历的条件.
一个数一组:只要未到达序列终点的下一个.
两个数一组:只要最高位不是0且未到达终点下一个
三个数一组:最高位不是0且未到达终点下一个且数值小于等于255.
递归终止条件:
当到达末尾且恰好构成四组时,该结果就是一个合法地址,存储后并返回.
或者未到达末尾已经构成四组,函数直接返回即可.
代码
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res ;
if(s.length()>12||s.length()<4) return res ;
string ip = "";
subip(0,0, ip ,s , res);
return res;
}
void subip(int no,int i ,string ip, string &s,vector<string> & res){
if(i == s.length()&&no==4)
{
res.push_back(ip.substr(1,ip.length()));
return ;
}else if(no>4)return;
subip(no+1,i+1, ip+"."+s[i],s ,res);
if(i+1<s.length()&&s[i]>'0')
subip(no+1,i+2, ip+"."+s[i]+s[i+1], s,res);
if((i+1<s.length()&&i+2<s.length())&&s[i]>'0'&&(s[i]-'0')*100+(s[i+1]-'0')*10+s[i+2]-'0'<=255)
subip(no+1,i+3, ip+"."+s[i]+s[i+1] + s[i+2],s ,res);
}
};