括号生成

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

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

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

具体思路如下: 当我们清楚所有i<n时括号的可能生成排列后,对与i=n的情况,我们考虑整个括号排列中最左边的括号。 它一定是一个左括号,那么它可以和它对应的右括号组成一组完整的括号"( )",我们认为这一组是相比n-1增加进来的括号。

那么,剩下n-1组括号有可能在哪呢? 【这里是重点,请着重理解】 剩下的括号要么在这一组新增的括号内部,要么在这一组新增括号的外部(右侧)。

既然知道了i<n的情况,那我们就可以对所有情况进行遍历: "(" + 【i=p时所有括号的排列组合】 + ")" + 【i=q时所有括号的排列组合】 其中 p + q = n-1,且p q均为非负整数。 事实上,当上述p从0取到n-1,q从n-1取到0后,所有情况就遍历完了。

def generateParenthesis(n):
    if n == 0:
        return []
    total_l = []
    total_l.append([None])
    total_l.append(["()"])
    for i in range(2, n + 1):  # 开始计算i时的括号组合,记为l
        l = []
        for j in range(i):  # 遍历所有可能的括号内外组合
            now_list1 = total_l[j]
            now_list2 = total_l[i - 1 - j]
            # print(now_list1,now_list2)
            for k1 in now_list1:  # 开始具体取内外组合的实例
                for k2 in now_list2:
                    if k1 == None:
                        k1 = ""
                    if k2 == None:
                        k2 = ""
                    el = "(" + k1 + ")" + k2##组合内外情况
                    l.append(el)
                    print(k2,'####',l)
        total_l.append(l)
        print('********')
    return total_l[n]
print(generateParenthesis(3))

当n=3,i的取值范围为(2,4)

       i=2时,j=0,nowlist1=[none],nowlist2=['()'],此时,k1='',k2=(),故el=()(),l=[()()]

                    j=1,nowlist1=['()'],nowlist2=[none],此时,K1=(),k2='',故el=(()),l=[()(),(())]

     i=2循环结束后,total_l[2]=[()(),(())]

    i=3时,j=0,当k1=none,k2=[()()],l=[()()()],当k1=none,k2=[(())],l=[()()(),()(())]

                j=1,k1=(),k2=(),l=[()()(),()(()),(())()]

              j=2,k1的范围[()(),(())],k2=none,当k1=()(),el=(()()),k1=(()),el=((())),

                      最后,l=[()()(),()(()),(())(),(()()),((()))]

结束后,total_l[3]=[()()(),()(()),(())(),(()()),((()))]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值