leetcode第22题,括号生成,给定括号的个数,输出所有合法的括号组合。
这道题乍一看这的没有啥头绪,我一开始的思路是把括号编号,括号之间关系抽象成互相之间的嵌套,但是这样做一个有一个问题就是重复很多,需要最后一步去重的操作,这样并不是最好的办法。
我借鉴了网上一种非常巧妙的办法。括号匹配生成的时候,面临着两种选择,一个是加入右括号,一个是加入左括号,那么什么时候加入左括号,什么时候加入右括号呢?首先,一开始一定是左括号开头,下一步可以加左括号,也可以加右括号,原因是目前左括号的数目为1,比右括号数目0要大,因此可以匹配上。这样就可以写出递归函数了,这里注意递归的出口条件是,左括号的个数等于给定的数字时,意味着匹配结束,那么加上剩余的右括号就可以了。
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
def dfs(n,s,l,r,ans):
if (l == n):
ans.append(s+(n-r)*")")
return
else:
dfs(n,s+"(",l+1,r,ans)
if (l > r):
dfs(n,s+")",l,r+1,ans)
ans = []
if n > 0:
dfs(n,"",0,0,ans)
else:
return [""]
return ans