22. 括号生成 JavaScript实现

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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值