括号生成
题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题方法
方法一:
递归的方法: 当n=3时, 其结果为:
( generateParenthesis(2))
generateParenthesis(2) generateParenthesis(1)
generateParenthesis(1) generateParenthesis(2)
递归的方法一般都会比较耗时,不一定是最优选择
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n<1: return [""]
if n==1: return ['()']
result = []
i=0
while i<n:
if i==0:
result += ['('+strsn_1+')' for strsn_1 in self.generateParenthesis(n-1)]
else:
result += [strsi+strsn_i for strsi in self.generateParenthesis(i) for strsn_i in self.generateParenthesis(n-i)]
i+=1
result = list(set(result))
return result
方法二:
修改后的递归,减少了重复递归
在后面的result.append中,如果加入判断再添加到result,会节省很大的内存消耗
class Solution(object):
def generateParenthesis(self, n):
if n<1: return [""]
if n==1: return ['()']
res = []
for i in self.generateParenthesis(n - 1):
for j in range(len(i)):
res.append('(' + i[:j] + ')' + i[j:])
return list(set(res))
方法三:
另一种不同的思路
class Solution(object):
def generateParenthesis(self, n):
result = []
def trackback(S="", left=0, right=0):
if len(S) == 2 * n:
result.append(S)
if left < n:
trackback(S + '(', left + 1, right)
if right < left:
trackback(S + ')', left, right + 1)
trackback()
return result