22. 括号生成 -力扣(LeetCode)
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
方法1:使用动态规划方法:
f(n)="("+p+")"+q 其中:e=p+q e属于f(n-1)中的任意元素
有人会质疑,上面的结果一定时合法的括号组合吗?一个括号最后是否合法判断1,左括号数量=右括号数量 2,先添加左括号,再添加右括号。
以上状态转移方程式的最后的结果有重复,最后要去重。
python代码:
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
a=[]
a.append([""])
a.append(["()"])
for i in range(1,n+1):
temp=set()
for e in a[i]:
for j in range(0,len(e)):
temp.add("("+"".join(e[0:j])+")"+"".join(e[j:]))
a.append(list(temp))
return sorted(a[n])
方法2,深度优先遍历 dfs
条件:任何一个合法的括号,不管在哪个位置分割,都是左括号大于等于右括号的状态,若是右>左,则判定为不合法的括号组合。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res=[]
def parenthesis_dfs(ln,rn,s):
if ln==n and rn==n:
res.append(s)
return
if rn>ln: //不合法的括号组合,舍弃
return
if ln<n:
parenthesis_dfs(ln+1,rn,s+"(")
if rn<n:
parenthesis_dfs(ln,rn+1,s+")")
parenthesis_dfs(0,0,"")
return sorted(res)