加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[LeetCode] 93. Restore IP Addresses

发布时间:2020-12-14 04:30:59 所属栏目:大数据 来源:网络整理
导读: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码。 要求求出

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读