LeetCode.22 括号生成(python解法)

该博客探讨了如何使用动态规划解决LeetCode第22题,即生成所有有效括号组合的问题。通过分析括号的结构,博主提出从最左边括号开始,将其视为已固定的左括号,然后递归地在剩余的括号中寻找解决方案。在Python实现中,这个方法能够在44毫秒内完成,击败了94.35%的提交者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

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

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

solution_1

思路:动态规划。当我们清楚所有小于n时括号的可能生成排列后,对n的情况,我们考虑整个括号排列中最左边的括号。它一定是一个左括号,那么它可以和它对应的右括号组成一组完整的括号 “( )”,我们认为这一组是相比 n-1 增加进来的括号。

那么,剩下 n-1 组括号要么在这一组新增的括号内部,要么在这一组新增括号的外部(右侧)。既然知道了小于n的情况,那我们就可以对所有情况进行遍历:

“(” + 【i=p时所有括号的排列组合】 + “)” + 【i=q时所有括号的排列组合】

其中 p + q = n-1,且 p,q 均为非负整数。

当上述 p 从 0 取到 n-1,q 从 n-1 取到 0 后,所有情况就遍历完了。

结果:执行用时:44 ms
排名:战胜94.35%

代码如下

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n == 0:
            return []

        ress = []
        ress.append([None])  # 0组括号
        ress.append(['()'])  # 1组括号
        for i in range(2, n + 1):
            this_res = []
            for j in range(i):
                left_res = ress[j]
                right_res = ress[i - j - 1]
                for lr in left_res:  # 遍历j组括号的情况
                    for rr in right_res:  # 遍历i - j - 1组括号的情况
                        if lr == None:
                            lr = ''
                        if rr == None:
                            rr = ''
                        now_res = '(' + lr + ')' + rr
                        this_res.append(now_res)
            ress.append(this_res)
        return ress[n]

参考资料

括号生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值