当前位置: 首页 > news >正文

【LeetCode热题100道笔记】括号生成

题目描述

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

示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例 2:
输入:n = 1
输出:[“()”]

提示:
1 <= n <= 8

思考

核心思路是通过“计数约束”和“栈状态”确保括号生成合法

  1. 合法性规则:
    • 空栈/左括号未达上限(countLeft < n)时,只能先加左括号(左括号是合法括号的起点);
    • 仅当左括号数量 > 右括号数量(countLeft > countRight)时,才能加右括号(避免出现 ")(" 等非法结构);
  2. 终止条件:栈长度达到 2n(左+右括号共 n 对)时,生成一个合法括号组合;
  3. 回溯逻辑:每次添加括号后递归,递归结束后弹出括号、更新计数,恢复状态以尝试其他组合。

算法过程

  1. 初始化:结果列表 result,计数变量 countLeft(左括号数)、countRight(右括号数),栈 stack 存储当前括号序列;
  2. 递归入口:调用 dfs(),初始栈为空,先添加左括号(唯一合法选择);
  3. DFS核心逻辑
    • 终止:若栈长度 = 2n,将栈转为字符串加入 result,返回;
    • 加左括号:若 countLeft < n,压栈、countLeft++,递归后回溯(弹栈、countLeft--);
    • 加右括号:若 countLeft > countRight,压栈、countRight++,递归后回溯(弹栈、countRight--);
  4. 返回结果:递归结束后,result 包含所有合法组合,返回即可。

时空复杂度

  • 时间复杂度:O(4ⁿ/√n)
    合法括号组合总数为“卡特兰数” C(n) = (1/(n+1)) * C(2n, n),渐近复杂度为 4ⁿ/√n;每个组合生成需 O(n) 时间(栈转字符串),总时间复杂度为 O(4ⁿ/√n)。

  • 空间复杂度:O(n)
    递归栈深度最大为 2n(对应完整括号序列长度),栈 stack 最大长度也为 2n,但可简化为 O(n)(因 2nn 的线性倍数);额外空间不含结果存储。

代码一

/*** @param {number} n* @return {string[]}*/
var generateParenthesis = function(n) {const result = [];let countLeft = 0;let countRight = 0;const stack = [];const dfs = function() {if (stack.length === n * 2) {result.push(stack.join(''));return;}if (stack.length) {if (countLeft < n) {stack.push('(');countLeft++;dfs();stack.pop();countLeft--;}if (countLeft > countRight) {stack.push(')');countRight++;dfs();stack.pop();countRight--;}} else {stack.push('(');countLeft++;dfs();} };dfs();return result;    
};

优化

字符串拼接替代数组操作和参数传递替代全局计数,更简洁。

代码二

/*** @param {number} n* @return {string[]}*/
var generateParenthesis = function(n) {const result = [];// 递归函数:当前字符串、左括号数、右括号数const dfs = (current, left, right) => {// 终止条件:生成n对括号if (current.length === 2 * n) {result.push(current);return;}// 加左括号:左括号数量未达上限if (left < n) {dfs(current + '(', left + 1, right);}// 加右括号:右括号数量小于左括号(保证合法)if (right < left) {dfs(current + ')', left, right + 1);}};// 初始调用:空字符串,0左0右dfs('', 0, 0);return result;
};
http://www.xdnf.cn/news/1444393.html

相关文章:

  • 系统架构设计师备考第14天——业务处理系统(TPS)
  • WebAppClassLoader(Tomcat)和 LaunchedURLClassLoader(Spring Boot)类加载器详解
  • Llama v3 中的低秩自适应 (LoRA)
  • 51单片机-LED与数码管模块
  • 2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution
  • JetBrains 2025 全家桶 11合1 Windows直装(含 IDEA PyCharm、WebStorm、DataSpell、DataGrip等)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • 终于有人把牛客网最火的Java面试八股文整理出来了,在Github上获赞50.6K
  • 使用 PHP Imagick 扩展实现高质量 PDF 转图片功能
  • 特斯拉“宏图计划4.0”发布!马斯克:未来80%价值来自机器人
  • 超适合程序员做知识整理的 AI 网站
  • SQL 函数:使用 REPLACE进行批量文本替换
  • 嵌入式第四十五天(51单片机相关)
  • Windows 电源管理和 Shutdown 命令详解
  • 2025版基于springboot的电影购票管理系统
  • 【Canvas与图标】汽车多彩速度表图标
  • 汽车工装结构件3D扫描尺寸测量公差比对-中科米堆CASAIM
  • 1分钟生成爆款相声对话视频!Coze智能体工作流详细搭建教程,小白也能轻松上手
  • 后端框架(SpringBoot):自动配置的底层执行流程
  • 【开题答辩全过程】以 基于微信小程序的“XIN”学生组织管理系统为例,包含答辩的问题和答案
  • 【题解】Codeforces Round 1046 (Div. 1) A~C
  • 指针高级(2)
  • Spring Boot HTTP状态码详解
  • 关于linux数据库编程——sqlite3
  • Spring二级缓存为什么不行(详细)
  • Docker学习笔记(一):容器基础、生态与安装实践
  • 鸿蒙NEXT开发实战:图片显示、几何图形与自定义绘制详解
  • 编辑器vim(Linux)
  • 【Python接口自动化】调用飞书机器人
  • 树莓派 AT 指令串口助手