【LeetCode精选TOP面试题】22-括号生成

2022/03/10 09:53:02

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

回溯解法

思路

列出所有的排列组合然后剔除不符合要求的。

代码

// 找出使用n组括号时的所有排列组合,共有2^2n种组合方式

var generateParenthesis = function (n) {
  if (n <= 0) {
    return [];
  }
  let res = [];
  function def(paths) {
    if (paths.length == n * 2) {
      // n组括号的合法字符串数量为 n * 2
      res.push(paths);
      return;
    }
    def(paths + "(");
    def(paths + ")");
  }
  def("");
  return res;
};

// 控制只生成合法的括号
var generateParenthesis2 = function (n) {
  let res = [];

  function def(paths, left, right) {
    if (left > n || right > left) return; // 控制只生成合法的括号
    if (paths.length == n * 2) {
      res.push(paths);
      return;
    }
    def(paths + "(", left + 1, right);
    def(paths + ")", left, right + 1);
  }

  if (n <= 0) {
    return null;
  }
  def("", 0, 0);
  return res;
};

let result = generateParenthesis(3);
let result1 = generateParenthesis2(3);
console.log(result, result1);