一、题目描述
二、解题思路
又是一道运用回溯法的题目,首先看题目,要生成n对有效括号,那么就意味着有n个左括号和n个有括号,同时添加规则是:
- 当左括号还有的时候,可以继续往字符串添加。
- 当右括号比左括号的剩余数量多的时候,才可以往字符串添加,否则非法。
- 当字符串长度为2n时,停止添加
画个图看看:
因此,回溯法有三个要点(摘自力扣某位大佬的解释):
- 选择
- 每次的选择最多有两个,要么选左括号,要么右括号,“选择”会展开出一棵解的空间树。
- 用 DFS 的方式遍历这棵树,找出所有的解,这个过程叫回溯。
- 约束条件
- 什么情况可以选左括号,什么情况下可以选右括号,是约束条件。
- 利用约束做“剪枝”,即去掉不会产生解的选项,即剪去不会通往合法解的分支。比如:现在的字符串是
()
,而现在左右括号各剩余1个,如果再选右括号,那么就变成了())
,显然是错误的选择,此时不能让它进入递归。
- 目标
构建出一个用尽n对括号的合法字符串,即字符串长度达到2n即可结束递归。
三、代码实现
var generateParenthesis = function(n) {
res = []
const dfs = (lRemain,rRemain,str) =>{
if(str.length == 2*n){
res.push(str)
return
}
if(lRemain > 0){
dfs(lRemain-1,rRemain,str+'(')
}
if(lRemain < rRemain){
dfs(lRemain,rRemain-1,str+')')
}
}
dfs(n,n,'')
return res
};