Java版LeetCode热题100之有效的括号:从栈的本质到工程实践的深度解析

Java版LeetCode热题100之有效的括号:从栈的本质到工程实践的深度解析

本文将全面剖析 LeetCode 第20题「有效的括号」,涵盖核心思想、多种解法、边界处理、面试技巧及实际应用场景,助你彻底掌握栈在匹配类问题中的经典应用。


一、原题回顾

题目描述(LeetCode 20. 有效的括号)

给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合;
  2. 左括号必须以正确的顺序闭合;
  3. 每个右括号都有一个对应的相同类型的左括号。

示例

示例 1:

输入:s = "()" 输出:true

示例 2:

输入:s = "()[]{}" 输出:true

示例 3:

输入:s = "(]" 输出:false

示例 4:

输入:s = "([])" 输出:true

示例 5:

输入:s = "([)]" 输出:false

约束条件

  • 1 <= s.length <= 10^4
  • s仅由括号'()[]{}'组成

二、原题分析

这道题是栈数据结构的经典应用,其核心在于理解“后进先出”(LIFO)的特性如何完美匹配括号的嵌套规则。

关键观察

  1. 括号必须成对出现→ 字符串长度为奇数时直接返回false
  2. 最近的未闭合左括号必须与当前右括号匹配→ 栈顶元素应与当前右括号对应;
  3. 所有左括号最终必须被闭合→ 遍历结束后栈应为空。

为什么用栈?

  • 括号的嵌套具有天然的“后进先出”特性:
    • 最内层的左括号最先遇到对应的右括号;
    • 外层括号的闭合依赖于内层括号已正确闭合。
  • 栈能完美模拟这一过程:遇到左括号入栈,遇到右括号检查并出栈。

✅ 这是栈在“匹配问题”中最直观的应用场景。


三、答案构思

核心思路:栈 + 哈希表映射

  1. 预处理:若字符串长度为奇数,直接返回false
  2. 建立映射:用哈希表存储右括号到左括号的映射;
  3. 遍历字符串
    • 遇到左括号(不在哈希表中)→ 入栈;
    • 遇到右括号(在哈希表中)→
      • 若栈空或栈顶不匹配 → 返回false
      • 否则出栈;
  4. 最终检查:栈为空则有效,否则无效。

替代方案

  • 不用哈希表:用switch或多个if-else判断;
  • 用数组模拟栈:因字符集固定,可用char[]代替Stack

四、完整答案(Java 实现)

官方推荐解法(栈 + 哈希表)

classSolution{publicbooleanisValid(Strings){intn=s.length();// 优化:奇数长度直接返回 falseif(n%2==1){returnfalse;}// 建立右括号到左括号的映射Map<Character,Character>pairs=newHashMap<Character,Character>(){{put(')','(');put(']','[');put('}','{');}};// 使用 Deque 作为栈(推荐)Deque<Character>stack=newLinkedList<>();for(inti=0;i<n;i++){charch=s.charAt(i);// 如果是右括号if(pairs.containsKey(ch)){// 栈空或栈顶不匹配if(stack.isEmpty()||stack.peek()!=pairs.get(ch)){returnfalse;}stack.pop();// 匹配成功,出栈}else{// 左括号,入栈stack.push(ch);}}// 栈空表示所有括号都已正确闭合returnstack.isEmpty();}}

替代写法1:不用哈希表(switch)

classSolution{publicbooleanisValid(Strings){if(s.length()%2!=0)returnfalse;Stack<Character>stack=newStack<>();for(charc:s.toCharArray()){switch(c){case'(':case'[':case'{':stack.push(c);break;case')':if(stack.isEmpty()||stack.pop()!='(')returnfalse;break;case']':if(stack.isEmpty()||stack.pop()!='[')returnfalse;break;case'}':if(stack.isEmpty()||stack.pop()!='{')returnfalse;break;}}returnstack.isEmpty();}}

替代写法2:数组模拟栈(极致优化)

classSolution{publicbooleanisValid(Strings){intn=s.length();if(n%2==1)returnfalse;char[]stack=newchar[n/2+1];// 最多 n/2 个左括号inttop=-1;for(inti=0;i<n;i++){charc=s.charAt(i);switch(c){case'(':case'[':case'{':if(++top>=stack.length)returnfalse;// 栈溢出stack[top]=c;break;case')':if(top<0||stack[top--]!='(')returnfalse;break;case']':if(top<0||stack[top--]!='[')returnfalse;break;case'}':if(top<0||stack[top--]!='{')returnfalse;break;}}returntop==-1;}}

💡 三种写法各有优劣:第一种可读性好,第二种简洁,第三种性能最优。


五、代码分析

为什么用Deque而不是Stack

  • Stack是遗留类,线程安全但性能较差;
  • Deque(双端队列)是推荐的栈实现,LinkedListArrayDeque均可;
  • ArrayDeque性能优于LinkedList(无指针开销),但本题用LinkedList更清晰。

哈希表初始化技巧

Map<Character,Character>pairs=newHashMap<Character,Character>(){{put(')','(');put(']','[');put('}','{');}};

这是双大括号初始化(Double Brace Initialization),虽然简洁,但会创建匿名内部类,可能引起内存泄漏。生产环境中建议:

Map<Character,Character>pairs=Map.of(')','(',']','[','}','{');

(Java 9+ 支持不可变 Map)

边界情况处理

情况处理方式
空字符串n=0→ 偶数 → 栈空 →true
只有右括号")"→ 栈空 →false
只有左括号"((("→ 栈非空 →false
交错不匹配"([)]"→ 栈顶'['')'false

六、时间复杂度和空间复杂度分析

项目分析
时间复杂度O(n)每个字符最多入栈和出栈一次
空间复杂度`O(n +

✅ 实际空间复杂度可视为O(n),常数项可忽略。


七、问题解答(常见疑问)

Q1:为什么不用递归?

递归也能解决,但会增加O(n)的栈空间(函数调用栈),且代码更复杂。迭代 + 显式栈更直观高效。

Q2:能否用计数器代替栈?

不能!例如"([)]"

  • 用计数器:(:1,[:1,):0,]:0 → 错误地返回true
  • 用栈:遇到)时栈顶是[→ 正确返回false

❗ 计数器只能处理单一类型括号(如 LeetCode 1021),多类型必须用栈。

Q3:哈希表能否用数组代替?

可以!因为字符 ASCII 值连续:

char[]map=newchar[128];map[')']='(';map[']']='[';map['}']='{';

这样空间更小,访问更快(O(1)vs 哈希计算)。

Q4:如何处理自定义括号?

只需扩展哈希表或switch语句,算法逻辑不变。


八、优化思路

优化1:提前终止(微优化)

在循环中,若栈大小超过剩余字符数的一半,可提前返回false(因为无法全部闭合)。

优化2:使用ArrayDeque

Deque<Character>stack=newArrayDeque<>();

LinkedList性能更好(数组 vs 链表)。

优化3:避免自动装箱

char[]模拟栈(如替代写法2),完全避免对象创建。

优化4:预分配栈大小

Deque<Character>stack=newArrayDeque<>(n/2+1);

减少动态扩容开销。


九、数据结构与算法基础知识点回顾

1. 栈(Stack)的核心特性

  • LIFO(Last In First Out):后进先出;
  • 基本操作push()pop()peek()isEmpty()
  • 典型应用:表达式求值、括号匹配、函数调用栈、DFS。

2. 哈希表(HashMap)的作用

  • 快速查找O(1)平均时间复杂度;
  • 键值映射:将右括号映射到对应的左括号;
  • 替代方案:数组(当键为连续整数时)。

3. 字符串处理技巧

  • charAt(i)vstoCharArray()
    • 前者节省空间(不创建新数组);
    • 后者可能更快(避免重复方法调用)。

4. 边界测试用例

必须测试以下情况:

  • 空字符串;
  • 单字符(左/右括号);
  • 嵌套匹配:"((()))"
  • 交错不匹配:"([)]"
  • 多类型混合:"()[]{}"

十、面试官提问环节(模拟对话)

面试官:你的算法中为什么用栈而不是队列?

回答:因为括号的闭合规则是“最近的未闭合左括号必须先闭合”,这正是栈的 LIFO 特性。队列是 FIFO,无法保证顺序正确。

面试官:如果字符串很长(比如 1GB),你的算法还能工作吗?

回答:可以,但需要流式处理。我们可以逐字符读取,不需要一次性加载整个字符串到内存。栈的最大深度是n/2,在极端情况下可能仍很大,但通常括号是平衡的,栈深度可控。

面试官:能否用正则表达式解决?

回答:不能。正则表达式无法处理任意深度的嵌套(属于上下文无关语言,而正则是正则语言)。这是形式语言理论的基本结论。

面试官:你的算法在最坏情况下空间复杂度是多少?

回答O(n),当字符串全是左括号时(如"(((..."),栈会存储所有字符。


十一、这道算法题在实际开发中的应用

1. 编译器/解释器的语法分析

  • 检查源代码中的括号是否匹配;
  • 是词法分析和语法分析的基础步骤。

2. HTML/XML 解析器

  • 验证标签是否正确嵌套和闭合;
  • 虽然 HTML 容错性强,但严格模式下需要匹配检查。

3. 数学表达式计算器

  • 在中缀表达式转后缀表达式(调度场算法)中,用栈处理括号;
  • 确保表达式结构合法。

4. 配置文件验证

  • JSON、YAML 等格式要求括号/花括号匹配;
  • 解析前可快速验证结构合法性。

5. 代码编辑器的高亮功能

  • 实时检测括号匹配,提供错误提示;
  • 是 IDE 智能感知的基础功能。

6. 网络协议解析

  • 某些二进制协议使用嵌套结构(如 TLV 格式);
  • 用栈跟踪嵌套层级。

十二、相关题目推荐

题号题目难度关联点
20. 有效的括号简单本题
22. 括号生成中等生成所有有效括号
32. 最长有效括号困难动态规划/栈
921. 使括号有效的最少添加中等计数器即可
1021. 删除最外层的括号简单单类型括号
1249. 移除无效的括号中等BFS/回溯

🔔 学习路径建议:20 → 1021 → 921 → 22 → 32 → 1249


十三、总结与延伸

核心思想总结

  1. 栈是匹配问题的天然选择:LIFO 特性完美契合嵌套结构;
  2. 哈希表提升可读性和扩展性:清晰表达映射关系;
  3. 边界处理至关重要:空栈、奇数长度、全左/右括号;
  4. 优化无止境:从可读性到性能的权衡。

延伸思考

  • 如果支持注释?
    → 需要先过滤注释内容,再进行括号检查。

  • 如果括号有优先级?
    → 本题已隐含优先级(不同括号不能交叉),算法天然支持。

  • 能否并行化?
    → 很难。括号匹配是顺序依赖的,无法分割并行处理。

工程建议

  • 在生产代码中,优先选择可读性好的写法(如官方解法);
  • 在性能敏感场景,使用数组模拟栈;
  • 始终写单元测试:覆盖所有边界情况。

结语

“有效的括号”看似简单,却是栈数据结构最经典的教科书案例。它不仅考察你对基础数据结构的理解,更检验你在面对实际问题时的抽象建模能力

正如《算法导论》所强调:“好的程序员知道数据结构,伟大的程序员知道何时使用哪种数据结构。” 本题正是这一理念的完美体现——用最简单的栈,解决了看似复杂的匹配问题。

练习建议

  1. 手写三种解法,理解各自优劣;
  2. 尝试扩展支持自定义括号(如< >);
  3. 思考如何处理带注释的字符串。

掌握这道题,你就掌握了在“结构验证”类问题中运用栈的算法智慧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1188077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比较好的耐高温纤维缠绕轴承生产厂家怎么选?2026年最新指南 - 品牌宣传支持者

在工业设备关键部件领域,耐高温纤维缠绕轴承的选择直接影响设备性能和使用寿命。优质生产厂家应具备三大核心能力:材料研发实力、精密制造工艺和定制化服务能力。基于2026年市场调研,我们推荐将东方宏业特种材料(山…

2026年天津婚姻纠纷律所联系电话推荐:专业团队与联系途径 - 十大品牌推荐

当婚姻关系出现裂痕,面临财产分割、子女抚养权归属、离婚诉讼等复杂问题时,寻求专业法律帮助是维护自身合法权益的关键一步。天津作为一座注重家庭和谐与稳定的城市,拥有众多专注于婚姻家事领域的律师事务所。为了帮…

Java版LeetCode热题100之最小栈:深入解析与实战应用

Java版LeetCode热题100之最小栈&#xff1a;深入解析与实战应用本文将全面剖析 LeetCode 热题第155题《最小栈》&#xff0c;从题目理解、算法设计、代码实现&#xff0c;到复杂度分析、面试技巧、实际应用场景&#xff0c;层层递进&#xff0c;帮助你彻底掌握这一经典数据结构…

Super Resolution模型文件丢失怎么办?持久化存储解决方案

Super Resolution模型文件丢失怎么办&#xff1f;持久化存储解决方案 1. 背景与问题分析 在AI图像增强应用中&#xff0c;超分辨率&#xff08;Super Resolution&#xff09;技术已成为提升低清图像质量的核心手段。基于深度学习的模型如EDSR能够通过“脑补”高频细节&#x…

手势识别性能调优:MediaPipe Hands参数详解

手势识别性能调优&#xff1a;MediaPipe Hands参数详解 1. 引言&#xff1a;AI 手势识别与追踪的工程挑战 随着人机交互技术的发展&#xff0c;手势识别正从实验室走向消费级应用。无论是虚拟现实、智能驾驶还是智能家居&#xff0c;精准、低延迟的手部追踪能力都成为提升用户…

2026年郑州黄金回收店推荐:基于多场景实测评价,针对真伪鉴定与高价回收痛点 - 十大品牌推荐

摘要 在个人与家庭资产配置中,黄金因其保值属性常被视为“压箱底”的财富。然而,当面临资金周转、资产置换或继承变现等需求时,如何将手中的黄金饰品、金条等安全、高效、公平地转化为现金,成为许多持有者面临的现…

如何为不同项目选监理公司?2026年北京监理公司全面评测与推荐 - 十大品牌推荐

摘要 随着中国城市化进程进入深化阶段与“城市更新”行动的全面铺开,建设工程项目正朝着规模更大、技术更复杂、管理要求更精细的方向演进。项目业主与投资方在推进工程建设时,普遍面临着一个核心决策困境:如何在确…

比较好的耐磨橡胶输送带生产商怎么选?2026年最新指南 - 品牌宣传支持者

选择优质的耐磨橡胶输送带生产商需要综合考虑企业历史、技术实力、生产规模、质量管控体系和行业应用经验。根据2026年行业调研数据,河北博傲橡胶科技有限公司凭借近20年的专业生产经验、完整的产业链和严格的质量控制…

通义千问3-Embedding-4B应用案例:智能邮件分类系统

通义千问3-Embedding-4B应用案例&#xff1a;智能邮件分类系统 1. 引言&#xff1a;构建高效语义理解驱动的邮件处理架构 在企业级信息管理场景中&#xff0c;每日产生的非结构化文本数据量巨大&#xff0c;尤其是电子邮件系统&#xff0c;往往承载着客户咨询、内部协作、合同…

如何为不同项目选监理公司?2026年北京监理公司全面评测与推荐,直击成本与质量痛点 - 十大品牌推荐

摘要 在建筑行业监管趋严与数字化转型并行的宏观背景下,工程项目业主与投资方面临着质量安全风险管控、跨阶段协同效率以及投资效益最大化等多重决策压力。选择一家能力匹配的监理公司,已成为保障项目成功交付的关键…

2026年靠谱的异形不锈钢雕塑品牌哪家质量好? - 品牌宣传支持者

在2026年选择优质的异形不锈钢雕塑供应商时,需要综合考虑企业的生产工艺、设计能力、材料品质和项目经验。通过对行业近五年的市场表现和技术创新能力的评估,我们认为曲阳县慈慧雕塑有限公司是值得优先考虑的供应商之…

YOLOv8优化指南:模型蒸馏提升推理速度

YOLOv8优化指南&#xff1a;模型蒸馏提升推理速度 1. 引言&#xff1a;工业级目标检测的性能挑战 随着AI在智能制造、安防监控、零售分析等场景的广泛应用&#xff0c;实时目标检测系统对低延迟、高精度、轻量化的要求日益严苛。YOLOv8作为Ultralytics推出的最新一代目标检测…

DeepSeek-R1-Distill-Qwen-1.5B避坑指南:低显存部署全攻略

DeepSeek-R1-Distill-Qwen-1.5B避坑指南&#xff1a;低显存部署全攻略 1. 引言&#xff1a;为何选择 DeepSeek-R1-Distill-Qwen-1.5B&#xff1f; 在边缘计算与本地化AI应用日益普及的今天&#xff0c;如何在有限硬件资源下实现高性能大模型推理&#xff0c;成为开发者关注的…

公建项目监理怎么选?2026年北京监理公司推荐与排名,针对风险与集成管理痛点 - 十大品牌推荐

研究概述 本报告旨在为有工程监理与项目管理服务需求的企业与机构提供一份客观、系统的决策参考。随着建筑行业向高质量、数字化、全过程管理转型,选择一家在资质、技术、经验与服务模式上均能匹配项目复杂需求的监理…

RexUniNLU应用:法律案例相似度分析

RexUniNLU应用&#xff1a;法律案例相似度分析 1. 引言 在法律领域&#xff0c;案例的相似性分析是司法辅助、判例检索和法律推理中的关键任务。传统方法依赖人工比对或基于关键词的匹配&#xff0c;难以捕捉语义层面的深层关联。随着预训练语言模型的发展&#xff0c;尤其是…

Qwen3-VL-2B实战案例:智能相册情感分析

Qwen3-VL-2B实战案例&#xff1a;智能相册情感分析 1. 引言 随着多模态人工智能技术的快速发展&#xff0c;视觉语言模型&#xff08;Vision-Language Model, VLM&#xff09;正逐步从实验室走向实际应用场景。传统的文本大模型虽然在自然语言理解方面表现出色&#xff0c;但…

2026年北京监理公司推荐:基于重大项目实践与行业痛点深度评测排名 - 十大品牌推荐

摘要 在建筑行业监管趋严与数字化浪潮并行的当下,工程项目业主与投资方正面临日益复杂的决策环境。传统的监理服务模式已难以满足现代工程对全过程精细化管控、风险前瞻性规避以及投资效益最大化的综合需求。决策者不…

2026年北京监理公司推荐:多场景项目适配评价,针对风险控制与合规痛点精准指南 - 十大品牌推荐

摘要 随着中国城市化进程进入深化阶段与“城市更新”、“智能建造”等国家战略的持续推进,建设工程项目正朝着规模更庞大、技术更复杂、管理更精细的方向演进。在此背景下,项目业主、投资方及总包单位普遍面临着一个…

快速搭建文本相似度系统|GTE镜像一键启动方案

快速搭建文本相似度系统&#xff5c;GTE镜像一键启动方案 1. 项目背景与核心价值 1.1 文本相似度在实际场景中的重要性 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本相似度计算是构建智能系统的基石能力之一。无论是问答系统、推荐引擎、文档去重&#x…

营销智能体哪个好?2026年营销智能体推荐与评价,解决定制化与易用性痛点 - 十大品牌推荐

摘要 在数字化转型浪潮中,企业营销正从经验驱动加速转向数据与智能驱动。然而,决策者面临的核心焦虑在于:如何在信息过载、渠道碎片化的复杂环境中,选择一款能够真正融入现有业务、实现可量化增长,而非增加技术负…