题目描述
解题思路
括号对数 | 生成的有效括号 |
---|---|
0对括号 | [None] |
1对括号 | [’()’] |
2对括号 | [’()()’,’(())’] |
3对括号 | [’()()()’,’()(())’,’(())()’,’(()())’,’((()))’] |
思路一:
首先将0组括号记为None,1组括号记为()
- 当计算2组括号时,2组括号生成的有效括号必然是在1组括号的基础上生成的,它一定是一个左括号和与之对应的右括号,是相比1组括号多出来的,要解决的是1组括号是放到新增括号的内部还是外部。
简单来说,对于求n对括号生成的有效括号,分成单独一对括号和n-1对有效括号两部分,n-1对括号仅有可能存在一对括号内部或者外部 - 不管计算几组括号生成的有效括号,均采用以上这种思想,当计算3组括号时,令i=3,括号p+q<=i-1,则分为几种情况:p=0,q=2;p=1,q=1;p=2,q=0。
对所有情况进行遍历:
“(” + 【i=p时所有括号的排列组合】 + “)” + 【i=q时所有括号的排列组合】
p=0,q=2:’()()()’,’()(())’
p=1,q=1:’(())()’
p=2,q=0:’(()())’,’((()))’
python代码
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n == 0:
return []
total_l = []
total_l.append([None]) # 0组括号时记为None
total_l.append(["()"]) # 1组括号只有一种情况
for i in range(2,n+1): # 开始计算i组括号时的括号组合
l = []
for j in range(i): # 开始遍历 p q ,其中p+q=i-1 , j 作为索引
now_list1 = total_l[j] # p = j 时的括号组合情况
now_list2 = total_l[i-1-j] # q = (i-1) - j 时的括号组合情况
for k1 in now_list1:
for k2 in now_list2:
if k1 == None:
k1 = ""
if k2 == None:
k2 = ""
el = "(" + k1 + ")" + k2
l.append(el) # 把所有可能的情况添加到 l 中
total_l.append(l) # l这个list就是i组括号的所有情况,添加到total_l中,继续求解i=i+1的情况
return total_l[n]
if __name__ == '__main__':
s = Solution()
res = s.generateParenthesis(3)
print(res)