力扣Hot100回溯算法(Python版)详解第二部分

一、39. 组合总和(中等)

  • 代码:
  • class Solution:
        def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
            ans = []
            path = []
    
            def dfs(i: int, left: int) -> None:
                if left == 0:
                    # 找到一个合法组合
                    ans.append(path.copy())
                    return
    
                if i == len(candidates) or left < 0:
                    return
    
                # 不选
                dfs(i + 1, left)
    
                # 选
                path.append(candidates[i])
                dfs(i, left - candidates[i])
                path.pop()  # 恢复现场
    
            dfs(0, target)
            return ans
    

    二、22. 括号生成

  • 代码
  • class Solution:
        def generateParenthesis(self, n: int) -> List[str]:
            m = n * 2  # 括号长度
            ans = []
            path = [''] * m  # 所有括号长度都是一样的 m
            # i = 目前填了多少个括号
            # open = 左括号个数,i-open = 右括号个数
            def dfs(i: int, open: int) -> None:
                if i == m:  # 括号构造完毕
                    ans.append(''.join(path))  # 加入答案
                    return
                if open < n:  # 可以填左括号
                    path[i] = '('  # 直接覆盖
                    dfs(i + 1, open + 1)  # 多了一个左括号
                if i - open < open:  # 可以填右括号
                    path[i] = ')'  # 直接覆盖
                    dfs(i + 1, open)
            dfs(0, 0)
            return ans
    

    三、79. 单词搜索(中等)

  • 代码
  • class Solution:
        def exist(self, board: List[List[str]], word: str) -> bool:
            m, n = len(board), len(board[0])
            def dfs(i: int, j: int, k: int) -> bool:
                if board[i][j] != word[k]:  # 匹配失败
                    return False
                if k == len(word) - 1:  # 匹配成功!
                    return True
                board[i][j] = ''  # 标记访问过
                for x, y in (i, j - 1), (i, j + 1), (i - 1, j), (i + 1, j):  # 相邻格子
                    if 0 <= x < m and 0 <= y < n and dfs(x, y, k + 1):
                        return True  # 搜到了!
                board[i][j] = word[k]  # 恢复现场
                return False  # 没搜到
            return any(dfs(i, j, 0) for i in range(m) for j in range(n))
    

    作者:Y1nhl

    物联沃分享整理
    物联沃-IOTWORD物联网 » 力扣Hot100回溯算法(Python版)详解第二部分

    发表回复