题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
思路分析:
我找了一张很不错的图。
一开始答案为空字符串,左括号和右括号数量都是空。
往下走,可以添加左括号,但不可以添加右括号,因为此时答案为空,其中没有左括号, 答案中左括号的数量 >= 右括号的数量。
一直这样像二叉树一样的走下去,直到左括号和右括号的数量相等且等于题目所给数值N时,将当前答案记录。
显然递归出口 :
左括号数量 = 右括号数量 = n
右括号数量大于左括号数量
完整代码
def generateParenthesis(n):
res = []
def dfs(ans,left,right):
if left == n and right == n:
res.append(ans)
return
# 在答案中的左括号数量大于右括号数量。在剩余结果中,左括号应该小于右括号数量,否则return
if right > left:
return
if left < n:
dfs(ans+'(',left+1,right)
if right < n:
dfs(ans+')',left,right+1)
dfs('',0,0)
return res
if __name__ == '__main__':
n = 2
print(generateParenthesis(n))