题目分析:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
解题思路:
这一题与【LeetCode】91. Decode Ways 非常相似,那个是翻译成字母这个翻译成ip,本质是相同的,那个题让求的是有几种方案而不需要求出具体样式,一般涉及字符串求几种情况,或者最优情况便可用动态规划。这个需要具体结果那么我们就应该用递归解了。
- 计算的时候我们可以循环截取1,2,3位转换为int如果小于255就可以组成ip的一段。
- 我们还可以对后面预处理:截取后的长度应该小于等于
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")) #提交时请删除该行
附: (一开始写的垃圾代码,执行时间相同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