• 93. Restore IP Addresses


    题目链接:https://leetcode.com/problems/restore-ip-addresses/?tab=Description

    题目大意:给定一个字符串,字符串只包含数字,要求返回所以合法的IP地址组合。

    思路:IP地址由四个字节组成,每个字节表示的整数范围为0-255,所以需要把字符串分成四个部分,在所有分法中找出合法的划分即可。

    算法步骤:1、初始化一个vector<string>,用于保存合法IP;2、构造获取所有组合方式的循环,并判断每种组合是否合法,如果合法,保存到vector中;3、返回vector;

    算法复杂度:时间复杂度为O(1),空间复杂度为O(n)

    代码:

    递归版本

     1 class Solution {
     2 public:
     3     vector<string> restoreIpAddresses(string s) {
     4         return subRestoreIpAddresses(s, 1);
     5     }
     6     vector<string> subRestoreIpAddresses(string s, int num) {
     7         vector<string> res;
     8         if (num == 4) {
     9             if (isValid(s)) {
    10                 res.push_back(s);
    11             }
    12         }
    13         else {
    14             for (decltype(s.size()) i = 1; i < s.size() && i <= 3; ++i) {
    15                 string pre_byte = s.substr(0, i);
    16                 if (!isValid(pre_byte))
    17                     continue;
    18                 vector<string> tmp = subRestoreIpAddresses(s.substr(i), num + 1);
    19                 for (auto s : tmp)
    20                     res.push_back(pre_byte + '.' + s);
    21             }
    22         }
    23         return res;
    24     }
    25     bool isValid(const string s) {
    26         if (s.size() > 1) {
    27             if (s[0] == '0' || s.size() > 3)
    28                 return false;
    29             if (strToInt(s) > 255)
    30                 return false;
    31         }
    32         return true;
    33     }
    34     int strToInt(const string s) {
    35         int res = 0;
    36         for (decltype(s.size()) i = 0; i < s.size(); ++i) {
    37             res = res * 10 + (s[i] - '0');
    38         }
    39         return res;
    40     }
    41 };

    非递归版本

     1 class Solution {
     2 public:
     3     vector<string> restoreIpAddresses(string s) {
     4         vector<string> res;
     5         if (s.size() < 4)
     6             return res;
     7         for (decltype(s.size()) i = 1; i < 4 && i <= s.size() - 3; ++i)
     8             for (auto j = i + 1; j < i + 4 && j <= s.size() - 2; ++j)
     9                 for (auto k = j + 1; k < j + 4 && k <= s.size() - 1; ++k) {
    10                     string byte1 = s.substr(0, i), byte2 = s.substr(i, j - i);
    11                     string byte3 = s.substr(j, k - j), byte4 = s.substr(k);
    12                     if (isValid(byte1) && isValid(byte2) && isValid(byte3) && isValid(byte4)) {
    13                         res.push_back(byte1 + '.' + byte2 + '.' + byte3 + '.' + byte4);
    14                     }
    15                 }
    16         return res;
    17     }
    18     bool isValid(const string s) {
    19         if (s.size() > 1 && s[0] == '0')
    20             return false;
    21         if (s.size() > 3 || strToInt(s) > 255)
    22             return false;
    23         return true;
    24     }
    25     int strToInt(const string s) {
    26         int res = 0;
    27         for (auto c : s)
    28             res = res * 10 + c - '0';
    29         return res;
    30     }
    31 };

    评测系统上运行结果:

  • 相关阅读:
    进程的经典同步问题
    数学余数在计算机的用途
    7.货仓选址 绝对值不等式
    6. 排队打水 排序不等式
    5.合并果子 Huffman树
    4.区间覆盖 区间问题
    3.区间分组 区间问题
    2.最大不相交区间数量 区间问题
    1.区间选点 区间问题
    26.拆分-Nim游戏 博弈论
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6509968.html
Copyright © 2020-2023  润新知