ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

leetcode(87)_93_medium_复原 IP 地址_python

2021-10-18 18:31:57  阅读:225  来源: 互联网

标签:medium python IP self 地址 str ip path 87


复原 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)

标签:medium,python,IP,self,地址,str,ip,path,87
来源: https://blog.csdn.net/qq_40137656/article/details/120831672

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有