22. 括号生成
一、思想
详解
1、其中整个过程就是不停的选择左括号还是右括号加入到最后的字符串中,所以最后的选择会展开成一颗解的空间树。所以利用DFS遍历最后的这棵树就行了。
2、选择可以按照规则来(即,什么情况下可以选左括号,什么情况下可以选右括号),对树进行剪枝。有以下两点:
(1) 左括号的选择:只要(有剩,就可以选(
(2) 右括号的选择:当剩下的)比(多时,才可以选)
3、结束条件:当构建的字符串的长度为 2*n 时,一个合法解就生成了,放心地加入解集。
二、代码实现
var generateParenthesis = function(n) {
let res = []
// 定义DFS遍历,参数有左括号数量,右括号数量,以及最后生成的字符串
var dfs = function(left,right,str){
// 终止条件:字符串构建完成,将字符串加入到解集中,终止当前递归分支
if(str.length == 2*n){
res.push(str)
return;
}
// 选择左括号,只要(有剩余就选
if(left > 0) dfs(left-1,right,str+'(')
// 选择右括号,只有右括号的数量大于左括号,才能选
if(left < right) dfs(left,right-1,str+')')
};
// 调用dfs,初始的左括号和右括号的数量都是n,字符串是空
dfs(n,n,"")
return res;
};