【LeetCode】93. Restore IP Addresses 解题报告(Python)

题目分析:

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]

解题思路:

这一题与【LeetCode】91. Decode Ways 非常相似,那个是翻译成字母这个翻译成ip,本质是相同的,那个题让求的是有几种方案而不需要求出具体样式,一般涉及字符串求几种情况,或者最优情况便可用动态规划。这个需要具体结果那么我们就应该用递归解了。

  1. 计算的时候我们可以循环截取1,2,3位转换为int如果小于255就可以组成ip的一段。
  2. 我们还可以对后面预处理:截取后的长度应该小于等于 3 * 剩余的段数 ,比如还需要2段,当前长度为9,那么你不能只截1位或者2位,必须截取3位。
    综合1,2写成代码就是:if int(s[:i]) <= 255 and len(s) - i <= 3 * n:

提交代码:(Runtime: 40 ms, faster than 93.50% )

class Solution:
    def restoreIpAddresses(self, s: str) -> list:
        res = []
        def dfs(s, n, ip):
            if n == -1:
                if s == '':
                    res.append(ip[:-1])
                return
            for i in range(1, 4):
                if i <= len(s):
                    if len(s) - i <= 3 * n and int(s[:i]) <= 255:
                        dfs(s[i:], n - 1, ip + s[:i] + '.')
                    if s[0] == '0':
                        break
        dfs(s, 3, '')
        return res

print(Solution().restoreIpAddresses("25525511135")) #提交时请删除该行

参考博客1 , 参考博客2

附: (一开始写的垃圾代码,执行时间相同Runtime: 40 ms, faster than 93.50%,就是代码特长)

class Solution:
    def restoreIpAddresses(self, s: str) -> list:
        res = []

        def dfs(s, i, chuan):
            tmp = chuan
            if s == '':
                if i == -1:
                    res.append(chuan[:-1])
                return
            elif s[0] == '1':
                chuan += s[:1] + '.'
                dfs(s[1:], i - 1, chuan)
                chuan = tmp
                if len(s) >= 2 and len(s) - 2 <= 3 * i:
                    chuan += s[:2] + '.'
                    dfs(s[2:], i - 1, chuan)
                    chuan = tmp
                if len(s) >= 3 and len(s) - 3 <= 3 * i:
                    chuan += s[:3] + '.'
                    dfs(s[3:], i - 1, chuan)
            elif s[0] == '2':
                chuan += s[:1] + '.'
                dfs(s[1:], i - 1, chuan)
                chuan = tmp
                if len(s) >= 2 and len(s) - 2 <= 3 * i:
                    chuan += s[:2] + '.'
                    dfs(s[2:], i - 1, chuan)
                    chuan = tmp
                if len(s) >= 3 and ((s[1] == '5' and s[2] <= '5') or s[1] < '5') and len(s) - 3 <= 3 * i:
                    chuan += s[:3] + '.'
                    dfs(s[3:], i - 1, chuan)
            elif s[0] == '0':
                chuan += s[:1] + '.'
                dfs(s[1:], i - 1, chuan)
            else:
                chuan += s[:1] + '.'
                dfs(s[1:], i - 1, chuan)
                chuan = tmp
                if len(s) >= 2 and len(s) - 2 <= 3 * i:
                    chuan += s[:2] + '.'
                    dfs(s[2:], i - 1, chuan)
        dfs(s, 3, '')
        return res

你可能感兴趣的:(python,LeetCode,递归,LeetCode题目记录)