描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
思路
括号表达式表示了运算的层级结构,一个有n个括号的表达式可以由一个含有n+1个结点的多叉树表示。因此,生成所有的括号表达式,等价于生成所有的指定结点数目的n叉树,由多叉树的层级结构很容易得出对应的括号关系。
构造n叉树的思路,第一次写这个问题,代码感觉不优雅,居然有回调。
代码
class Solution:
def __init__(self):
self.dp = {0:[""],1:["()"]}
def generateParenthesis(self, n):
if(n in self.dp): return self.dp[n]
ret = []
num_seq = self.getNumSeq(n)
for seq in num_seq:
temp_ret = []
self.dfs(seq,temp_ret,len(seq)-1)
for s in temp_ret: ret.append(s)
self.dp[n] = ret
return ret
def dfs(self,seq,ret,i,ss = ""):
if(i<0):
ret.append(ss)
return
n = seq[i]
sub_ret = self.generateParenthesis(n-1) # 回调
for s in sub_ret:
n_s = "(" + s + ")"+ss
self.dfs(seq,ret,i-1,n_s)
def getNumSeq(self,n):
if(n == 0): return [[]]
ret = []
for i in range(1,n+1):
n_seq = self.getNumSeq(n-i)
for seq in n_seq:
seq.append(i)
ret.append(seq)
return ret