首页 > 其他分享 >leetcode 22 括号生成 js 实现

leetcode 22 括号生成 js 实现

时间:2022-10-09 01:44:44浏览次数:83  
标签:right 22 temp pop js 括号 回溯 leetcode left

22. 括号生成

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8
/**
 * @param {number} n
 * @return {string[]}
 */
 /**
 * 回溯法(DFS)
 * 把握核心规则:
 *  - 必须是有效组合,则左、右括号一定要小于n, 且右括号的数量要一直小于或等于左括号
 *  - 针对组成的括号字符串的每一个位置字符来说,要么是左括号,要么是右括号, 具体这个位置应该是左还是右,看上面的规则而定
 *  - 所以想到,我可以递归地往每个位置放左和右括号,如果违反了规则,就回溯回去,换一个放,由此想到了回溯算法
 *  - 既然是递归,首先要先想好终止条件,依题可知,如果左右括号的数量都为n的话,即为一个答案了,终止递归,返回即可
 * 解题:left 记录已经放入的左括号的数量; right 记录右括号的数量;str 表示当前组成的字符串
 */
// https://leetcode.cn/problems/generate-parentheses/solution/jsshua-ti-mian-shi-ti-jie-by-distracted-br3o6/

// 当左括号数量小于n时,可以添加一个左括号,但是括号总数不增加
// 当右括号数量小于左括号时,可以添加一个右括号,括号总数加1
// 当括号总数等于n时,返回当前缓存数组中的值
var generateParenthesis = function(n) {
    const res = [];
    // index 代表当前括号对数,left,right分别代表左右括号数,temp 代表当前生成的临时的括号数组
    const dfs = (index, left, right, temp) => {
        if(index === n){
            res.push(temp.slice().join(""));
            console.log("满足条件,回溯终止,temp",temp)
            return;
        }
        // 先判断左括号数量, 小于 n,则 push 左括号
        if(left < n){
            temp.push('(');
            // 会进入递归,直到左括号数量满足条件,结束此递归,进入下一行
            console.log("left temp",temp)
            dfs(index, left+1, right, temp);
            temp.pop(); // pop 的主要作用是回溯
            console.log("left pop temp",temp)
        }
      
        // 再判断右括号数量,小于左括号,则与左括号数量对齐,push 右括号
        if(right < left){
            temp.push(')');
            console.log("right temp",temp)
            dfs(index+1, left, right+1, temp);
            temp.pop(); // pop 的主要作用是回溯
            console.log("right pop temp",temp)
        }
    }
    dfs(0, 0, 0, []);
    return res;
};

https://leetcode.cn/problems/generate-parentheses/

标签:right,22,temp,pop,js,括号,回溯,leetcode,left
From: https://www.cnblogs.com/beileixinqing/p/16770817.html

相关文章

  • JSP动漫论坛
    ​九重天动漫论坛系统的设计方案,主要包括系统运用的关键技术,数据库设计,对各个功能模块的详细设计以及实现,本次设计主要实现论坛系统中以下几个功能:注册会员,会员登录,管理员......
  • 2022-2023-1 20221406《计算机基础与程序设计》第六周学习总结
    2022-2023-120221406《计算机基础与程序设计》第六周学习总结班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP学习目标:Polya如何解决问题简单类型与......
  • js实现淡入淡出轮播图
    淡入淡出轮播图实现功能:1、鼠标离开自动轮播,鼠标滑入停止自动轮播2、点击圆圈或箭头,更换轮播图片实现思路:1、搭建框架:通过html、css搭建框架渲染样式,通过把第一张设置......
  • 2022-CodeStar十一综合评估CSP-S模拟
    T3:小猴摘桃给定一颗树,求树上经过偶数个节点的路径数量。限制:\(n\leqslant10^5\)参考难度:普及+/提高算法分析\(30\)分枚举起点\(S\),枚举终点\(T\),使用DFS......
  • Codeforces Round #822 (Div. 2)
    A题意给一个长为n的数组,每次可以对其中某个数做+1或-1的操作。求最小的操作次数,使得可以从数组中选出三个相同的数。思路很容易可以想到选三个最接近的数然后操作。也......
  • Angular 打包 js文件 过大
    1、加了--prod参数后,angular-cli会把用不到的包都删掉//package.json中"scripts":{..."build":"ngbuild--prod"...}2、nginx开启gzip优化、在nginx中server......
  • LeetCode 字符串相乘算法题解 All In One
    LeetCode字符串相乘算法题解AllInOnejs/ts实现字符串相乘jsbignumbermultiply/js大数相乘字符串相乘原理&图解LeetCode43.MultiplyStringsLee......
  • LeetCode算法笔记 53. 最大子数组和
    给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2......
  • 20221415_获奖感言及学习总结
    20221415_获奖感言及学习总结获奖感言很荣幸可以获得娄老师的奖品。我会再接再厉学好编程。学习总结敢学、不服输的态度C语言最开始的学习无疑是痛苦的,如果一直对......
  • LeetCode算法笔记 217. 存在重复元素
    给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=......