[LeetCode] 93. Restore IP Addresses

Posted cff2121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 93. Restore IP Addresses相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 93. Restore IP Addresses

[leetcode]93. Restore IP Addresses还原IP地址

LeetCode-93-Restore IP Addresses

LeetCode93. Restore IP Addresses 面试题

leetcode 93-Restore IP Addresses(medium)

[LeetCode] 93. Restore IP Addresses