Leetcode 93 复原IP地址 C++

思路:首先应该对IP地址有一定的了解。IP地址是由32位二进制数表示的,为了方便,通常将32位二进制数分为4段,然后将每一段表示成为0到255的十进制数,即通常我们会看到的:XXX.XXX.XXX.XXX。每一段的数字可以有一位、两位或三位,范围是[0,255]。但是需要注意:当只有一位是可以为0,当有两位或三位时不能为0,即像 00, 01, 001, 011, 000等都是不合法的。
对IP地址有了一定的了解后,再看本题的要求,求解各种可能情况的问题,一般都会考虑到递归调用。所以本题用k来记录还剩几段没有划分,当k=0时,输出可能的结果。用isValue来判断当前划分的字符串,是否在区间[0,255]中。具体代码如下:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> ans;
        restore(s,4,"",ans);
        return ans;
    }
    void restore(string s,int k,string tmp,vector<string> &ans)
    {
        if(k==0)
        {
            if(s.empty()) ans.push_back(tmp);
        }
        else
        {
            for(int i=1;i<=3;++i)
            {
                if(s.size()>=i&&isValue(s.substr(0,i)))
                {
                    if(k==1) restore(s.substr(i),k-1,tmp+s.substr(0,i),ans);
                    else restore(s.substr(i),k-1,tmp+s.substr(0,i)+".",ans);
                }
            }
        }
    }
    bool isValue(string s)
    {
        if(s.empty()||s.size()>3||(s.size()>1&&s[0]=='0')) return false;
        int m=atoi(s.c_str());
        return m<=255&&m>=0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值