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

猜你喜欢

转载自blog.csdn.net/qq_43387999/article/details/87701516
今日推荐