【LeetCode】22.括号生成(Python 版)

本篇博客探讨了如何使用Python生成所有有效括号的组合,包括暴力法、回溯法和动态规划法。对于给定的括号对数n,详细解释了每种方法的思路和实现细节,特别强调了动态规划法中的闭合数概念及其状态转移方程。
摘要由CSDN通过智能技术生成

题目描述

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

思路

方法一:暴力法:枚举出所有的括号组合,再判断其是否有效

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def generate(seq=[]):
            if len(seq) == 2 * n:
                if valid(seq):
                    ans.append("".join(seq))
            else:
                seq.append('(')
                generate(seq)
                seq.pop()
                seq.append(')')
                generate(seq)
                seq.pop()

        def valid(seq):
        # 通过左右括号的数量是否匹配判断序列是否有效
            left = 0
            for c in seq:
                if c == '(':
                    left += 1
                else:
                    left -= 1
                # left 小于 0 说明出现了右括号在左括号之前
                if left < 0:
                    return False
            return left == 0

        ans = []
        generate()
        return ans

方法二:回溯法(其实也是一种DFS):
暴力方法的过程中会生成很多很显然不正确的序列,例如’((((((’,但从左右括号数量上看就不符合。为了减少不必要的序列城市,将检查有效性提前,只有当序列当前有效时才继续添加’(‘或者’)’。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res = []
        def backtrack(prefix, left, right):
            if len(prefix) == 2 * n:
                res.append(prefix)
                return
            # 控制左括号的数量,避免出现'(((((('的情况
            if left < n:
                backtrack(prefix + '(', left + 1, right)
            # 控制右括号的数量
            if right < left:
                backtrack(prefix + ')', left, right + 1)
        backtrack('', 0, 0)
        return res

方法三:动态规划法(官方题解称为闭合数):
假如我们已经知道 n=i 时的所有有效括号组合,用 S 表示其中任意一个组合,那么n=i+1 时的所有有效括号应该如何计算?是

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值