深度优先搜索DFS | 回溯 | 剪枝:力扣93. 复原IP地址

1、题目描述:

深度优先搜索DFS | 回溯 | 剪枝:力扣93. 复原IP地址_第1张图片

2、题解:

方法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()               #撤销最后的选择,回到之前的状态

3、复杂度分析:

深度优先搜索DFS | 回溯 | 剪枝:力扣93. 复原IP地址_第2张图片

你可能感兴趣的:(LeetCode高频面试题)