LeetCode 「中等」22.括号生成

sankigan2025-3-4算法LeetCode

括号生成open in new window

题目描述

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

示例

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

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

解答

关键思路

  1. 有效性条件
  • 有效的括号组合必须满足:每个右括号 ) 都有一个对应的左括号 (,并且右括号不能出现在左括号之前
  • 在生成过程中,我们需要确保:
    • 左括号的数量不能超过 n
    • 右括号的数量不能超过左括号的数量
  1. 回溯法
  • 使用递归回溯法来生成所有可能的括号组合
  • 在递归过程中,逐步添加左括号 ( 和右括号 ),并确保满足有效性条件
  1. 递归终止条件
  • 当左括号和右括号的数量都达到 n 时,生成了一个有效的括号组合,将其加入结果列表

具体步骤

  1. 定义递归函数
  • 递归函数需要记录当前生成的括号字符串、左括号的数量和右括号的数量
  1. 递归逻辑
  • 如果左括号的数量小于 n,可以添加一个左括号 (,并递归
  • 如果右括号的数量小于左括号的数量,可以添加一个右括号 ),并递归
  1. 剪枝
  • 如果左括号或右括号的数量超过了限制,直接返回
  1. 终止条件:
  • 如果左括号和右括号的数量都等于 n,将当前字符串加入结果列表
Code
/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
  const result = [];

  const backtrack = (current, left, right) => {
    // 如果左括号和右括号的数量都达到 n,生成了一个有效组合
    if (left === n && right === n) {
      result.push(current);
      return;
    }

    // 如果左括号的数量小于 n,可以添加一个左括号
    if (left < n) {
      backtrack(current + '(', left + 1, right);
    }

    // 如果右括号的数量小于左括号的数量,可以添加一个右括号
    if (right < left) {
      backtrack(current + ')', left, right + 1);
    }
  };

  // 从空字符串开始,左括号和右括号的数量都为 0
  backtrack('', 0, 0);
  return result;
}
更新于 2025/3/20 23:23:29