给出 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]=[()()(),()(()),(())(),(()()),((()))]