【LeetCode每日一练】22. 括号生成(中等|JS|回溯算法)

一、题目描述

在这里插入图片描述

二、解题思路

又是一道运用回溯法的题目,首先看题目,要生成n对有效括号,那么就意味着有n个左括号和n个有括号,同时添加规则是:

  1. 当左括号还有的时候,可以继续往字符串添加。
  2. 当右括号比左括号的剩余数量多的时候,才可以往字符串添加,否则非法。
  3. 当字符串长度为2n时,停止添加

画个图看看:
在这里插入图片描述

因此,回溯法有三个要点(摘自力扣某位大佬的解释):

  1. 选择
  • 每次的选择最多有两个,要么选左括号,要么右括号,“选择”会展开出一棵解的空间树。
  • 用 DFS 的方式遍历这棵树,找出所有的解,这个过程叫回溯。
  1. 约束条件
  • 什么情况可以选左括号,什么情况下可以选右括号,是约束条件。
  • 利用约束做“剪枝”,即去掉不会产生解的选项,即剪去不会通往合法解的分支。比如:现在的字符串是(),而现在左右括号各剩余1个,如果再选右括号,那么就变成了()),显然是错误的选择,此时不能让它进入递归。
  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
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值