leetcode(87)_93_medium_复原 IP 地址_python

复原 IP 地址

题目描述:
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
示例 :
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
提示:

  • 0 <= s.length <= 3000
  • s 仅由数字组成

解法

使用回溯,具体可见代码注释。

代码
class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        res, path = [], []  # 分别记录所有的结果与当前的一种结果
        self.dfs(0, s, 3, path, res)
        return res

    def func(self, str_ip):  # ip 可以分为四个部分,判断字符串是否满足作为其中1个部分的要求
        if not str_ip:  # 不能为空字符串
            return False
        # 字符串长度为 1 是可以的;不为 1 则需要首字符不是 "0",并且数值不大于 255,并且总长度不能多于 3
        if len(str_ip) == 1 or (str_ip[0] != "0" and int(str_ip) <= 255 and len(str_ip) < 4):  
            return True
        return False
    
    def dfs(self, k, s, num_dot, path, res):
        if num_dot == 0 and self.func(s[k:]):  # 如果分隔符为 0,判断后面剩余的字符串是否可以作为最后一部分
            res.append("".join(path) + s[k:])  # 如果可以,就加入 res
            return
        if len(s) - k > 3 * (num_dot + 1) or len(s) - k < num_dot + 1:  # 剪枝。剩余字符个数过长或过短,直接结束
            return
        for i in range(k, min(k + 3, len(s))):  # 最多三个字符,最少一个字符
            if self.func(s[k: i + 1]):
                path.append(s[k: i + 1] + ".")
                self.dfs(i + 1, s, num_dot - 1, path, res)
                path.pop()
      
测试结果

执行用时:48 ms, 在所有 Python3 提交中击败了33.05%的用户
内存消耗:16 MB, 在所有 Python3 提交中击败了5.15%的用户

说明

算法题来源:力扣(LeetCode)

上一篇:sql server 2008安装过程中服务器配置出错


下一篇:LeetCode解题思路汇总