码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 93. Restore IP Addresses

时间:2019-05-14 12:48:14      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:add   html   res   ipaddress   ||   一个   nbsp   blog   for   

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

题目要求将一串只包含数字的字符串分割成合法的IP码。要求求出所有可能的情况,所以使用递归法进行求解。
相当于将长字符串分割成4个小字符串,每个小字符串均符合IP地址的格式。IP地址格式要求:
  1. 子字符串的长度要>0且<=3
  2. 子字符串的字面值>=0且<=255
  3. 子字符串的非0数字前不能有0。例如:010、001都是不合法的

使用标志k记录当前所得的子字符串个数。当满足有4个子字符串并且s中的字符全部用到了,就得到了一个合法的IP地址,将其放入res中。

每个子字符串的长度均为1~3,合法子字符串中间加.进行分割,最后一个子字符串后边不用加.

代码如下:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> res;
        restore(s,4,"",res);
        return res;
    }
    void restore(string s,int k,string out,vector<string> &res){
        if(k==0){
            if(s.empty())res.push_back(out);
        }
        else{
            for(int i=1;i<=3;++i){
                if(s.size()>=i && isValid(s.substr(0,i))){
                    if(k==1)restore(s.substr(i),k-1,out+s.substr(0,i),res);
                    else restore(s.substr(i),k-1,out+s.substr(0,i)+".",res);
                }
            }
        }
    }
    bool isValid(string s){
        if(s.empty() || s.size()>3 || (s.size()>1 && s[0]==0))return false;
        int res=atoi(s.c_str());
        return res>=0 && res<=255;
    }
};

 

 

也可以将判断子字符串是否合法的函数用条件语句代替。其中,判断字符串前边是否有0的语句为:

i != std::to_string(val).size()

意思是当前子字符串的长度是否和该字符串转为整型再转为字符串后的长度一致,如果不一致就表明不合法。例如:当i=3,子字符串为"010",子字符串转为整型变成10,再转为字符串变成"10",长度比3小,因此该字符串不合法。

代码如下:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> res;
        restore(s, 4, "", res);
        return res;
    }
    void restore(string s, int k, string out, vector<string> &res) {
        if (k == 0) {
            if (s.empty())res.push_back(out);
        }
        else {
            for (int i = 1; i <= 3; ++i) {
                if (s.size() < k)break;
                int val = atoi(s.substr(0, i).c_str());
                if (val > 255 || i != std::to_string(val).size())continue;
                restore(s.substr(i), k - 1, out + s.substr(0, i) + (k > 1 ? "." : ""), res);
            }
        }
    }
};

 

参考:https://www.cnblogs.com/grandyang/p/4305572.html

[LeetCode] 93. Restore IP Addresses

标签:add   html   res   ipaddress   ||   一个   nbsp   blog   for   

原文地址:https://www.cnblogs.com/cff2121/p/10861363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!