LeetCode 93. 复原IP地址

题目

有效 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除 s 中的任何数字。你可以按任何顺序返回答案。

例:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

方法:回溯、递归
  • path 表示一个有效 IP 地址,存储方式为数字,例如存在有效 IP 地址 "0.1.2.201",那么它在 path 中的形式为 [0, 1, 2, 201]。result 表示所有有效 IP 地址

backtrack 函数:回溯

  • 若字符串的长度大于 12,那么该字符串一定不能为有效 IP 地址
  • 若 path 中存在 4 个数字,且字符串已完成遍历,那么表示该分割可以生成有效 IP 地址,将其以正确的格式加入 result
  • 遍历剩余未被分割的字符串,若选择的子串合法,那么将其加入 path,调用 backtrack 继续遍历

isValid 函数:判断子串是否合法

  • 若子串的第一个数字为 0, 且该子串并不是一个个位数,那么该子串不合法
  • 若子串的数值大小小于 0 或大于 255,那么该子串不合法
  • 否则,该子串合法
class Solution(object):
    def restoreIpAddresses(self, s):
        path, result = [], []

        def backtrack(s, startIndex):
            if len(s) > 12:
                return []
            if len(path) == 4 and startIndex == len(s):
                result.append('.'.join(path[:]))
                return None
                
            for i in range(startIndex, len(s)):
                if isValid(s[startIndex: i + 1]):
                    path.append(s[startIndex: i + 1])
                    backtrack(s, i + 1)
                    path.pop()
        
        def isValid(s):
            if s[0] == '0' and len(s) > 1:
                return False
            if int(s) < 0 or int(s) > 255:
                return False
            return True

        backtrack(s, 0)
        return result
参考

代码相关:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html

你可能感兴趣的:(LeetCode 93. 复原IP地址)