您的位置:首页 > 其它

Restore IP Addresses

2017-02-10 10:36 183 查看
这种带有回溯问题感觉有一种递归解决问题的范式,以此题为例写出自己的题解,自娱自乐,提神醒脑

题目叙述

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);

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: