方法1:DFS+回溯 + 剪枝
思路:
约束条件:
1、一个片段的长度是1~3
2、片段的值范围是0~255
3、不能是'0x','0xx'的形式,也就是一个片段的第一个数不能为0,当然除了长度为1时,可为0
这些是剪枝的要点
在约束条件下,DFS穷举所有点,找出所有可能的组合。
目标:
1、目标是生成4个有效的片段,并且要用光IP字符串的字符
2、当满足上面条件时,说明有一个有效组合,添加到结果数组中,然后回溯
3、生成4个有效片段,但是没用光字符,回溯 ,剪枝
4、遍历1~3的长度:
如果用光字符,回溯
如果是'0x','0xx'的形式,回溯,剪枝
然后判断s[start:start + i]的字符是否满足在0~255之间,如果不满足,回溯,剪枝
满足,添加进sub中
继续进行DFS
撤销选择
Python代码:
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
# 回溯
self.res = []
self.dfs([], 0, s)
return self.res
def dfs(self, sub, start, s): #复原从start开始的子串
if len(sub) == 4 and start == len(s): #满4段,且用光字符
self.res.append('.'.join(sub))
return
if len(sub) == 4 and start < len(s): #满4段,但没用光字符,回溯
return
for i in range(1, 4): #三种长度的选择
if start + i - 1 >= len(s): return #指针超出边界了
if i != 1 and s[start] == '0': return #不能是0x、0xx
temp = s[start:start + i] #记录当前切出的片段
if i == 3 and int(temp) > 255: return #不满足要求,剪枝
sub.append(temp) #做出选择
self.dfs(sub, start + i, s) #基于选择,向下选择
sub.pop() #撤销最后的选择,回到之前的状态