链接
https://leetcode-cn.com/problems/generate-parentheses/
前言
递归与回溯,用递归实现回溯算法
题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
- 示例1
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
关键
思路1
从上面的图片中我们可以很明显的看到,最后五条画黑线的就是最终的结果,其中左分支都是添加左括号,右分支都是添加右括号。
那么我们在什么情况下添加左括号呢? 很明显,最多能添加 n 个左括号,在递归调用的时候,在能传递到最底层的共用字符串中先添加 ”(“
,然后 left-1
,递归调用就可以。
那什么时候添加右括号呢? 当左括号个数大于右括号的个数时添加右括号。
总之,向下搜索要满足两个条件:
- 1.插入数量不超过n
- 2.可以插入
)
的前提是(
的数量大于)
回溯法的代码套路是使用两个变量: res
和 path
,res 表示最终的结果,path 保存已经走过的路径。如果搜到一个状态满足题目要求,就把 path 放到 res 中。
代码后面的判断条件都是 if,而不是 elif,因为是满足两个条件的任意一个就可以继续向下搜索,而不是同时只能满足其中的一个。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = []
def dfs(res, left, right, path):
if left==0 and right==0:
res.append(path)
return
if left > 0:
dfs(res, left-1, right, path + '(')
if left < right:
dfs(res, left, right-1, path + ')')
dfs(res, n, n, '')
return res
- DFS