原文:22. 括号生成(leetcode 高频面试题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-022/

题目:

难度:Middle

相关话题:字符串回溯算法

给出n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的 括号组合。

例如,给出n =** 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

思路:

每一个位置都有2个选择,放置(或者)

如果(的数量超过了n说明一定不成立;

如果)的数量超过了(的数量,也一定不成立;

如果两个的数量都为n,那么就是一个有效的完整组合。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
  let s=''
  let l="(",r=")"
  let res=[]
  function dfs(s,n,lN,rN){
    if(lN>n || lN<rN)return
    if(lN===n && rN===n)res.push(s)
    dfs(s+l,n,lN+1,rN)
    dfs(s+r,n,lN,rN+1)
  }
  dfs(s,n,0,0)
  return res
};