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