力扣39.组合总和、22.括号生成、79.单词搜索

39.组合总和

思路:

和之前的题目类似,这里题目说明可以重复选取元素,所以用一个变量记录当前下标,递归从当前下标开始

代码:

python 复制代码
class Solution:
    def backtracking(self, curSum, candidates, path, result, index, target):
        if curSum > target:
            return
        
        if curSum == target:
            result.append(path[:])
            return

        for i in range(index, len(candidates)):
            curSum += candidates[i]
            path.append(candidates[i])
            self.backtracking(curSum, candidates, path, result, i, target)
            path.pop()
            curSum -= candidates[i]

    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        result = []
        self.backtracking(0, candidates, [], result, 0, target)
        return result

22.括号生成

思路:

  1. 终止条件:路径长度等于给定长度的两倍

  2. 回溯:根据当前路径中左括号和右括号的数量来决定是否可以添加左括号或右括号,并进行递归。

代码:

python 复制代码
class Solution:
    def backtracking(self, n, path, result, left, right):
        if len(path) == n * 2:
            result.append(path[:])
            return

        if left < n:
            self.backtracking(n, path + "(", result, left + 1, right)

        if right < left:
            self.backtracking(n, path + ")", result, left, right + 1)

    def generateParenthesis(self, n: int) -> List[str]:
        result = []
        self.backtracking(n, "", result, 0, 0)
        return result

79.单词搜索

参考:

https://leetcode.cn/problems/word-search/solutions/2361646/79-dan-ci-sou-suo-hui-su-qing-xi-tu-jie-5yui2

思路:

  1. 终止条件:返回真------单词长度走完;返回假(剪枝)------越界/字符不相同

  2. 回溯:判断完终止条件之后,把当前矩阵字符置为空,以免重复访问;对四个方向进行递归操作,只要有一个方向返回真即可,只需进行或操作;递归完成后,当前矩阵字符置为原来的字符

代码:

python 复制代码
class Solution:
    # i, j用于指示矩阵的下标,k用于指示单词的下标
    def backtracking(self, board, word, i, j, k):
        # 当越界/字符不相等时,返回假
        if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]:
            return False
        # 单词走到最后了
        if k == len(word) - 1:
            return True

        board[i][j] = ''  # 当前先置空,以防重复访问
        # 只要有一个方向返回真即可
        result = self.backtracking(board, word, i + 1, j, k + 1) or self.backtracking(board, word, i - 1, j, k + 1) or self.backtracking(board, word, i, j + 1, k + 1) or self.backtracking(board, word, i, j - 1, k + 1)
        board[i][j] = word[k]  # 回溯,设回原来的值

        return result

    def exist(self, board: List[List[str]], word: str) -> bool:
        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.backtracking(board, word, i, j, 0):
                    return True

        return False
相关推荐
哈里谢顿1 小时前
从零开始编写一个完整的Python HTTP REST API服务
python
清水白石00810 小时前
突破并行瓶颈:Python 多进程开销全解析与 IPC 优化实战
开发语言·网络·python
追随者永远是胜利者10 小时前
(LeetCode-Hot100)53. 最大子数组和
java·算法·leetcode·职场和发展·go
Lupino11 小时前
IoT 平台可编程化:基于 Pydantic Monty 构建工业级智能自动化链路
python
清水白石00812 小时前
突破性能瓶颈:深度解析 Numba 如何让 Python 飙到 C 语言的速度
开发语言·python
Bear on Toilet13 小时前
递归_二叉树_50 . 从前序与中序遍历序列构造二叉树
数据结构·算法·leetcode·深度优先·递归
yunhuibin13 小时前
AlexNet网络学习
人工智能·python·深度学习·神经网络
喵手14 小时前
Python爬虫实战:增量爬虫实战 - 利用 HTTP 缓存机制实现“极致减负”(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·增量爬虫·http缓存机制·极致减负
一个处女座的程序猿O(∩_∩)O15 小时前
Python异常处理完全指南:KeyError、TypeError、ValueError深度解析
开发语言·python