leetcode每日一练 括号生成 - JavaScript

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

一开始我的思路是暴力解法,遍历,把n=3的所有情况放进一个列表,然后再遍历这个列表,判断是否符合题意,但是这个空间复杂度太大,超时了。

于是我参考了笨猪爆破组的解题思路和方法

不停选括号,要么选左括号,要么选右括号。

只要(有剩,就可以选(。 (((((这么选,判定为非法。

合法的括号是先有左边括号,才有右边的括号,所以先匹配左边括号才能匹配右边的括号,即使
当剩下的   )  比   (   多时,才可以选   ),否则,)   不能选,选了就非法。 剩下的   )   比   (   少,即,使用的   )   比    (   多,不能成双成对。
描述节点的状态有:当前构建的字符串,和左右括号所剩的数量。

每次最多两个选择,选左括号或右括号,“选择”会展开出一棵解的空间树。
用 DFS 遍历这棵树,找出所有的解,这个过程叫回溯。
约束条件
即,什么情况下可以选左括号,什么情况下可以选右括号。
利用约束做“剪枝”,即,去掉不会产生解的选项,即,剪去不会通往合法解的分支。
比如(),现在左右括号各剩一个,再选)就成了()),因此需要结束这次错误的递归

if (right > left) {
 
    // 右括号剩的比较多,才能选右括号

    dfs(str + ')', left, right - 1);
}

var generateParenthesis = function(n) {
    const final = []

    const dfs = (left , right,str) =>{

        if(str.length===2 * n){
            final.push(str)
            return
        }
        if(left>0){
            dfs(left-1,right,str+'(')
        }
        if(right>left){
            dfs(left,right-1,str+')')
        }
    }
    dfs(n,n,'')
    return final
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值