题目描述:
给定一个只包含数字的字符串,用以表示一个 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)