返回

解锁括号生成难题:JS实现的解析

前端

揭开括号生成之谜

括号生成问题是一个经典的算法难题,要求生成所有有效的括号组合,其中每个左括号都必须与一个右括号匹配。这个问题看似简单,但实际上具有指数级的时间复杂度,因此需要采用有效的算法来解决。

JS实现背后的逻辑:DFS算法

我们采用深度优先搜索(DFS)算法来解决括号生成问题。DFS是一种遍历树或图的算法,它通过不断深入当前节点的子节点来探索整个结构。在括号生成问题中,我们将左括号和右括号视为树的节点,并使用DFS算法来遍历所有可能的组合。

算法步骤分解

  1. 初始化:

    • 设定左括号和右括号的剩余数量。
    • 将空字符串作为初始解。
    • 将初始解和剩余括号数量压入栈中。
  2. 循环遍历:

    • 从栈中弹出当前解和剩余括号数量。
    • 如果左括号的剩余数量大于0,将左括号添加到当前解中,并将左括号的剩余数量减1。
    • 如果左括号的长度小于有括号的长度,将右括号添加到当前解中,并将右括号的剩余数量减1。
    • 将新的当前解和剩余括号数量压入栈中。
  3. 递归结束条件:

    • 当左括号和右括号的剩余数量都为0时,表明当前解是一个有效的括号组合,将其添加到结果列表中。

代码实现

/**
 * 给定一个数字 n,生成所有有效的括号组合。
 *
 * @param {number} n 左括号和右括号的数量
 * @return {string[]} 所有有效的括号组合
 */
const generateParenthesis = (n) => {
  // 初始化
  const stack = [];
  const results = [];
  stack.push({
    str: '',
    left: n,
    right: n,
  });

  // DFS 循环
  while (stack.length > 0) {
    const current = stack.pop();
    if (current.left === 0 && current.right === 0) {
      // 有效括号组合
      results.push(current.str);
      continue;
    }

    // 添加左括号
    if (current.left > 0) {
      stack.push({
        str: current.str + '(',
        left: current.left - 1,
        right: current.right,
      });
    }

    // 添加右括号
    if (current.right > 0 && current.right > current.left) {
      stack.push({
        str: current.str + ')',
        left: current.left,
        right: current.right - 1,
      });
    }
  }

  return results;
};

结语

括号生成问题是一个经典的算法难题,通过采用深度优先搜索(DFS)算法,我们可以有效地生成所有可能的括号组合。JavaScript代码的实现清晰易懂,帮助读者掌握算法的精髓。希望这篇文章能够帮助读者更深入地理解括号生成问题及其解决方案。