class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
if n == 0:
return []
res = [[] for _ in range(n+1)]
res[0] = ['']
for i in range(1, n+1):
for j in range(i):
p = res[j]
q = res[i-j-1]
for k1 in p:
for k2 in q:
res[i].append('(' + k1 +')' + k2)
return res[n]
关于这道题的题解,其实我也是看了大神的思路,核心思想如下:
p + q = n - 1,
"(" + [i=p时所有括号的排列组合] + ")" + [i=q时所有括号的排列组合]
有点不太好理解,这里举个栗子,假设我们要求n=3的时候的括号组合,p + q = 2,那么这个时候就有
p = 0, q = 2
p = 1, q = 1
p = 2, q = 0
三种组合,这里假设我们已知n = 2的所有括号组合的情况,实际上是['()()', '(())'],那么这时候再加一对(),加在哪里呢?
要么加在外面,要么加在中间
当p = 0, q = 2时,就是()()(),()(())两种
当p = 1, q = 1时,就是(())()一种
当p = 2, q = 1时,就是(()()),((()))两种
至于为什么要这么做?
作者没说
下面解释下代码,res生成了n+1个不同组合,假设n=3,res就是[[],[],[],[]]
定义n=1的时候括号组合,res[0] = ['']
j作为索引,遍历0-n-1,相当于p
假设此时求n = 2的括号组合
i = 1,2
当i = 1的时候,j = 0,p = res[0] = [''],q = res[1-0-1] = res[0] = [''],res = [[''], ['()'], []]
当i = 2的时候,j = 0,1,
当j = 0的时候,p = res[0] = [''],q = res[1] = ['()'],res[2] = ['()()'],res = [[''], ['()'], ['()()']]
当j = 1的时候,p = res[1] = ['()'],q = res[0] = [''],res[2] = ['(())'],res = [[''], ['()'], ['()()','(())]]