zoukankan      html  css  js  c++  java
  • 【leetcode】Restore IP Addresses (middle)

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

    For example:
    Given "25525511135",

    return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

    思路:回溯法 解向量X={str0, str1, str2, str3} 分别是IP地址的四段

    判断每个解向量的部分时,先求出该部分最长和最短长度(根据后面每段最少1位,最多3位),回溯求解。符合条件时就把X按照要求的格式压入ans.

    注意,判断每个部分是否有效时要排除00,01,001...等0开头的情况。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <stack>
    using namespace std;
    
    class Solution {
    public:
        vector<string> restoreIpAddresses(string s) {
            vector<string> ans;
            int len = s.length();
            if(len < 4)
                return ans;
            
            vector<string> X(4, "");
            vector<vector<string>> S(4, vector<string>());
            int k = 0;
            int maxlen = min(3, len - 3 * 1);
            int minlen = max(1, len - 3 * 3);
            for(int i = minlen; i <= maxlen; i++)
            {
                string sub = s.substr(0, i);
                if(isVaildIP(sub))
                {
                    S[0].push_back(sub);
                }
            }
    
            while(k >= 0)
            {
                while(!S[k].empty())
                {
                    X[k] = S[k].back();
                    S[k].pop_back();
                    if(k < 3)
                    {
                        k = k + 1;
                        int startloc = 0;
                        for(int j = 0; j < k; j++)
                        {
                            startloc += X[j].length();
                        }
                        int maxlen = min(3, len - (4 - k - 1) * 1 - startloc);
                        int minlen = max(1, len - (4 - k - 1) * 3 - startloc);
                        for(int i = minlen; i <= maxlen; i++)
                        {    
                            string sub = s.substr(startloc, i);
                            if(isVaildIP(sub))
                            {
                                S[k].push_back(sub);
                            }
                        }
                    }
                    else
                    {
                        ans.push_back(X[0]);
                        for(int i = 1; i < 4; i++)
                        {
                            ans.back().append(".");
                            ans.back().append(X[i]);
                        }
                    }
                }
                k--;
            }
    
            return ans;
        }
    
        bool isVaildIP(string snum)
        {
            if(snum.size() > 1 && snum[0] == '0')
                return false;
            int num = atoi(snum.c_str());
            return (num >= 0 && num <= 255);
        }
    };
    
    int main()
    {
        Solution s;
        string num =/* "25525511135"*/"010010";
        vector<string> ans = s.restoreIpAddresses(num);
    
        return 0;
    }
  • 相关阅读:
    js--DOM基本使用
    前端--js基础2
    前端--js基础1
    tcp/udp编程
    关于网络
    异常处理
    装饰器
    1.__new__ 魔术方法 单态(例)模式 __del__ 魔术方法(析构方法) __call__ 魔术方法
    面向对象程序设计及面向对象封装 目录
    script 标签里的 async 和 defer
  • 原文地址:https://www.cnblogs.com/dplearning/p/4198334.html
Copyright © 2011-2022 走看看