括号生成

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

示例 n = 3, 结果为:

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

 

题目有点难。理顺一下思路,终于实现,并通过。

思路:  递归

    难点:a.怎么生成 括号组合字符串,

                      用递归迭代生成字符串,每次分两次递归调用,一次是选择左括号,一次选择右括号。下面是完整代码。

         

 def generate(s,l1,l2,l):
             if l1.__len__() == 0 and l2.__len__() == 0: #递归结束
                 l.append(s)
             else:
                 s1 = s
                 l11 = l1.copy()   #python3才有copy 方法,  因为list是引用对象,必须复制一份,分开递归调用
                 l22 = l2.copy()
                 if l1.__len__() != 0 and l1.__len__() <= l22.__len__(): #选择左括号
                     s1 += l1.pop(0)
                     generate(s1,l1,l22,l)
                 if l2.__len__() != 0 and l1.__len__() <= l22.__len__(): #选择右括号
                     s += l2.pop(0)
                     generate(s,l11,l2,l)
    

              b,对有效括号的组合

                     在字符串想加的要满足左括号数大于等于右括号数,才是有效的括号组合,如上代码中,剩下的括号字符长度比较。l1.__len__() <= l22.__len__(),说明l1中剩下的左括号数少,字符串中选择的左括号数多。

 

其他思路:

    1,按照规律,第一个字符是左括号,

          这个比较难吧,没有想出来,不知道有没有规律可循

    2.生成所有组合,在挑选出来符合有效括号的组合。

        这个复杂度很大,  生成所有组合 n^2,在扫描 每个字符串是否是有效的括号组合 需要遍历n^2 次,每次判断2*n长度字符串是否是有效的括号组合。

 

最后:贴出官方的代码, 比我自己写的,简洁的太多,空间复杂度也低。我的那个容易想出来吧!这也是安慰安慰。

def generateParenthesis(self, N):
        ans = []
        def backtrack(S = '', left = 0, right = 0):
            if len(S) == 2 * N:
                ans.append(S)
                return
            if left < N:
                backtrack(S+'(', left+1, right)
            if right < left:
                backtrack(S+')', left, right+1)

        backtrack()
        return ans

更多其他的思路:参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值