Restore IP Addresses

这种带有回溯问题感觉有一种递归解决问题的范式,以此题为例写出自己的题解,自娱自乐,提神醒脑

题目叙述

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

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值