leetcode 22 生成合法的括号组合

22. Generate Parentheses

给定n对括号,计算出n对括号的所有合法组合

方法一、通过数学归纳法来枚举

实现起来非常复杂…

方法二、递归搜索,然后排除非法的括号组合

将每一种括号的组合放在6个字符大小的数组中,共会产生22n个组合,时间复杂度位2(2n)
如何判断非法括号组合:从左往后扫描,当左括号出现次数少于右括号时即非法,如:())(()

方法三、在递归搜索的基础上使用剪枝法

还是递归,但使用剪枝法来排除产生非法的括号组合:左括号可以随便添加,最多到n个,但右括号添加时,必须比左括号数量少,这样就不会产生非法括号组合

代码
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        self.paren_conbi = []
        self._gen_paren(0, 0, n, '')
        return self.paren_conbi
    
    def _gen_paren(self, left, right, n, result=''):
        if left == n and right == n:
            self.paren_conbi.append(result)
            return
        
        if left < n:
            self._gen_paren(left+1, right, n, result+"(")
        if right < left and right < n:
            self._gen_paren(left, right+1, n, result+")")

递归规模以2倍增大,所以时间复杂度为O(2^n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值