返回

前端开发修炼场—解析括号生成器,助你突破难题22

前端




算法原理

括号生成器算法本质上是一种回溯算法,通过递归的方式生成所有可能的括号组合,然后逐个检查这些组合是否有效。算法的基本步骤如下:

  1. 定义一个辅助函数 generateParenthesis,该函数接受一个参数 n,表示要生成的括号对数。
  2. 在 generateParenthesis 函数中,使用递归的方式生成所有可能的括号组合。具体来说,对于每个括号对,可以有两种选择:左括号在前或右括号在前。因此,对于 n 个括号对,共有 2^n 种可能的组合。
  3. 对于生成的每一种组合,使用一个辅助函数 isValidParentheses 检查该组合是否有效。isValidParentheses 函数接受一个字符串参数,表示一个括号组合,并返回该组合是否有效。
  4. 将所有有效的括号组合收集起来,并返回。

JavaScript实现

/*
 * 括号生成器算法
 *
 * @param {number} n 要生成的括号对数
 * @return {string[]} 所有可能的有效括号组合
 */
function generateParenthesis(n) {
  if (n <= 0) {
    return [];
  }

  // 定义辅助函数 generateParenthesisHelper,用于递归生成括号组合
  function generateParenthesisHelper(left, right, currentString) {
    // 如果左括号和右括号都用完了,则返回当前字符串
    if (left === 0 && right === 0) {
      return [currentString];
    }

    // 如果左括号还有剩余,则可以将左括号添加到当前字符串中
    if (left > 0) {
      const newString = currentString + '(';
      const result = generateParenthesisHelper(left - 1, right, newString);
      return result;
    }

    // 如果右括号还有剩余,则可以将右括号添加到当前字符串中
    if (right > 0) {
      const newString = currentString + ')';
      const result = generateParenthesisHelper(left, right - 1, newString);
      return result;
    }

    // 如果既没有左括号也没有右括号了,则说明当前字符串无效,直接返回空数组
    return [];
  }

  // 定义辅助函数 isValidParentheses,用于检查一个括号组合是否有效
  function isValidParentheses(string) {
    const stack = [];

    for (const char of string) {
      if (char === '(') {
        stack.push('(');
      } else if (char === ')') {
        if (stack.length === 0) {
          return false;
        }

        stack.pop();
      }
    }

    return stack.length === 0;
  }

  // 生成所有可能的括号组合
  const allCombinations = generateParenthesisHelper(n, n, '');

  // 过滤无效的括号组合
  const validCombinations = allCombinations.filter(isValidParentheses);

  return validCombinations;
}

扩展阅读

总结

括号生成器算法是一种回溯算法,用于生成所有可能的有效括号组合。该算法通过递归的方式生成所有可能的括号组合,然后逐个检查这些组合是否有效。JavaScript实现代码提供了具体的实现细节,供读者参考。希望本文能够帮助你理解括号生成器算法的原理,并将其应用于实际编程中。