LeetCode题解:22. 括号生成,递归先生成再过滤,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/generate-parentheses/

解题思路:

  1. 先用递归生成所有可能的括号。
  2. 每层递归都对应左右括号两种可能,同时统计当前生成的字符串长度。
  3. 生成完相应长度的字符串后,过滤出有效括号,并将其存入结果。
// 校验字符串是否合法
function isValid(str) {
  let count = 0; // 使用变量计数判断是否有成对括号

  // 遍历所有字符
  for (const char of str) {
    // 遇到左括号时,统计数量
    if (char === '(') {
      count++;
    } else {
      // 遇到右括号时,如果左括号数量为0,表示括号不成对
      if (!count) {
        return false;
      }
      // 遇到右括号时,如果左括号有计数,则抵消一个
      count--;
    }
  }

  // 若完成遍历时,计数为0,表示括号都成对
  return !count;
}
// 递归生成所有可能的字符串
function generate(str, max, result) {
  // 递归终止条件:
  // 1. 生成的字符串达到最大值
  if (str.length === max) {
    // 2. 校验括号是否合法
    if (isValid(str)) {
      // 将合法的括号存入结果
      result.push(str);
    }

    // 生成的字符串已达到最大长度时,退出循环
    return;
  }

  // 当前层逻辑
  // 当前生成字符串有左右括号两种可能性
  let str1 = str + '(';
  let str2 = str + ')';

  // 进入下一层递归
  generate(str1, max, result);
  generate(str2, max, result);
}
/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function (n) {
  let result = []; // 存储结果

  // 递归生成所有可能括号,再过滤出合法的括号
  generate(
    '', // 初始字符串为空
    n * 2, // 生成的字符串长度
    result, // 存储结果
  );

  return result; // 返回结果
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值