LeetCode | 0093. Restore IP Addresses复原IP地址【Python】
LeetCode 0093. Restore IP Addresses复原IP地址【Medium】【Python】【回溯】【DFS】【暴力】
Problem
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
问题
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
思路
解法一
回溯 DFS
回溯算法的关键就是合理剪枝,这个也是难点。
详细可以看代码注释。
下面剪枝图片来源于 liweiwei1419 的 回溯算法(画图分析剪枝条件)
Python3代码
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
# solution one: backtracking
ans = []
self.dfs(s, [], ans)
return ans
def dfs(self, s, path, ans):
if len(s) > (4 - len(path)) * 3: # pruning: len(s) > 12
return
if not s and len(path) == 4: # remove first '.' and IP address should be 4 parts
ans.append('.'.join(path))
return
for i in range(min(3, len(s))):
cur = s[:i + 1]
if(cur[0] == '0' and len(cur) >= 2) or int(cur) > 255: # invalid IP address
continue
self.dfs(s[i + 1:], path + [s[:i + 1]], ans)
解法二
暴力
暴力出奇迹
四次 for 遍历,再分别取四部分作为地址,分别判断是否合法。
最后拼接一下,加入 ans 中。
Python3代码
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
# solution two: brute force search
ans = []
for a in range(1, 4):
for b in range(1, 4):
for c in range(1, 4):
for d in range(1, 4):
if a + b + c + d == len(s):
ss = [s[:a], s[a:a+b], s[a+b:a+b+c], s[a+b+c:]]
flag = 0
for k in range(4):
if int(ss[k]) > 255:
flag = 1
break
if len(ss[k]) >= 2 and ss[k][0] == '0': # for example: 0xx.xxx.xxx.xxx
flag = 1
break
if flag == 0:
ans.append(ss[0] + '.' + ss[1] + '.' + ss[2] + '.' + ss[3])
return ans
代码地址
参考
最怕一生碌碌无为,还说平凡难能可贵。