题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
思路
这种方法是 CareerCup 书上给的方法,是蛮巧妙的一种方法。
核心思想是找左括号:
每找到一个左括号,就在其后面加一个完整的括号,最后再在开头加一个 (),就形成了所有的情况,
需要注意的是,有时候会出现重复的情况,所以我们用 Set 这种数据结构,好处是如果遇到重复项,不会加入到结果中,最后我们再把 Set 转为 List 即可。
代码
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n == 0:
return []
if n == 1:
return ["()"]
if n == 2:
return ["(())","()()"]
total = [["()"],["(())","()()"]]
for i in range(1,n-1): #注意,取n-1而不要取n,因为取n最后total会生成到n+1个括号的情况,而我们只要n个括号的情况
par = [] #用于存放i+1个括号的所有情况
for j in range(len(total[i])): #遍历total中i个括号组成的所有情况
s =total[i][j] #取total中i个括号所有情况中的第j个情况
for k in range(len(s)): #遍历这个情况下的所有左括号
s_tmp = list(s) #s_tmp会变化,所以不要直接用s否则s长度发生变化,导致遍历失败,这里新开一个s_tmp变量来存放结果
if s[k]=="(":
s_tmp[k] = "(()" #遇到左括号就添加一个完整括号,相当于把"("换成"(()"
par.append("".join(s_tmp)) #让s_tmp从列表再转回字符串
par.append("()"+s) #添加多一个情况,就是再原来情况下,在前面多加一个"()"
total.append(list(set(par))) #去重
return total[n-1]