题目
给出 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]