【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
};

猜你喜欢

转载自blog.csdn.net/weixin_40764047/article/details/110731452