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

第十八天 有效的括号

栈的经典应用,建议先去了解栈的基础
题目链接:https://leetcode.cn/problems/valid-parentheses/ 视频讲解:https://www.bilibili.com/video/BV1AF411w78g

一、看到题目的第一想法

  1. 题目要求理解:给定一个只包含'('')''{''}''['']'的字符串,判断字符串中的括号是否有效。规则是:
    • 左括号必须用相同类型的右括号闭合;
    • 左括号必须以正确的顺序闭合;
    • 每个右括号都必须有对应的左括号。
  2. 核心思路:这是一道典型的应用题目,栈的 “后进先出” 特性正好能匹配括号的嵌套关系:
    • 遇到左括号时,把它压入栈中;
    • 遇到右括号时,检查栈顶是否是对应的左括号,如果是则弹出栈顶,否则直接返回false
    • 遍历结束后,栈为空说明所有括号都匹配成功,字符串有效。
  3. 初步实现念头
    • 先用n % 2 == 1快速过滤掉长度为奇数的字符串,因为奇数长度的字符串一定无法完全匹配。
    • 用一个unordered_map来存右括号和对应左括号的映射关系,这样遇到右括号时可以直接查表找对应的左括号。
    • 遍历字符串,遇到左括号压栈,遇到右括号检查栈顶是否匹配。

二、实现过程中遇到的困难

  1. 栈操作的边界条件
    • 一开始忘记处理 “栈为空时遇到右括号” 的情况,比如字符串开头就是')',直接访问stk.top()会导致程序崩溃。后来加上了stk.empty()的判断,保证取栈顶前栈非空。
    • 遍历结束后,忘记判断栈是否为空,比如字符串"(()"遍历结束后栈里还有一个'(',但一开始直接返回true,导致错误。
  2. 映射关系的方向搞反
    • 一开始错误地把pairs写成了左括号到右括号的映射,遇到右括号时无法直接查表找到对应的左括号,导致匹配逻辑混乱。后来改成了 “右括号 → 左括号” 的映射,这样遇到右括号时,直接用pairs[ch]就能拿到对应的左括号,和栈顶元素对比。
  3. 分支逻辑的混乱
    • 一开始把if-else的条件写反了,比如把 “遇到右括号” 的逻辑写到了else分支里,导致遇到左括号时执行了匹配右括号的代码,压栈和弹栈的逻辑完全颠倒。
    • 一开始没有用pairs.count(ch)来判断是否是右括号,而是用了多个if条件判断字符类型,代码非常冗余,后来才想到用哈希表简化判断。
  4. 特殊用例的遗漏
    • 一开始没考虑空字符串"",后来发现代码里return stk.empty()天然处理了这个情况,返回true,符合题目要求。
    • 没考虑括号类型不匹配的情况,比如"(]",一开始没有对栈顶元素和映射值进行对比,导致这类错误用例也返回了true

三、今日收获心得

  1. 栈在括号匹配问题中的核心应用这道题让我彻底理解了栈的 “后进先出” 特性在处理嵌套结构时的优势:栈顶元素永远是最近遇到的左括号,正好和下一个遇到的右括号进行匹配。这种思路不仅适用于括号匹配,还能推广到 HTML 标签匹配、表达式求值等场景。
  2. 哈希表简化条件判断的技巧unordered_map来存右括号和对应左括号的映射,把原本需要多个if-else的判断逻辑,简化成了查表操作,让代码更简洁、更易维护,也降低了出错的概率。
  3. 边界条件的重要性这道题的很多错误都来自边界条件:奇数长度、栈空取栈顶、遍历后栈非空等。通过这次实现,我养成了写代码前先列清楚所有边界情况的习惯,避免了程序崩溃和逻辑错误。
  4. 代码结构的优化意识学会了用 “快速过滤(奇数长度)→ 核心逻辑(栈 + 哈希表)→ 最终校验(栈空)” 的结构来组织代码,让逻辑层次更清晰,可读性更强。
  5. 对算法复杂度的理解加深整个算法的时间复杂度是 \(O(n)\),每个字符只需要入栈 / 出栈一次;空间复杂度是 \(O(n)\),最坏情况下(全是左括号)栈需要存下所有字符。这种线性复杂度的解法,是这类问题的最优解之一。
http://www.jsqmd.com/news/711349/

相关文章:

  • 零标注文本分类:半监督学习实战指南
  • 2026年量子计算与人工智能国际学术会议(ICQCAI 2026)
  • 智驱的“自动放行“会不会出事?——AI审批节点的安全边界设计
  • 健康管理师报名热线合规选择推荐及机构实测推荐:川汇区,淮阳区,三门峡市周口家政培训,周口育婴员,排行一览! - 优质品牌商家
  • 视觉语言模型高效压缩:DUET-VLM双阶段架构解析
  • 3步配置DoL-Lyra整合包:自动化构建系统使用指南
  • 推荐系统中的轻量级适配器头技术与多兴趣建模
  • 如何高效管理RimWorld模组:终极模组管理器完全指南
  • YOLO11语义分割注意力机制改进:全网首发--使用对比驱动特征聚合增强多尺度差异建模(方案3)
  • 为什么内容运营平台必须使用Redis?实战经验总结
  • 分片 vs 分布式:弹性与高可用性背后的数学原理
  • 8大网盘直链下载助手终极指南:轻松获取真实下载地址告别限速烦恼
  • LangGraph生产实战2026:构建有状态多步骤AI工作流的完整指南
  • 从零构建AI Agent:新手必看!5种核心工作流+实战避坑指南
  • 机器学习中测试集污染的防范与修复实践
  • Giga-snaP BGA适配器设计:解决高频信号与热膨胀挑战
  • 如何高效使用网盘直链下载助手:完整解决方案指南
  • 【末轮截稿、快速发表、SPIE出版】第六届中国膜计算论坛暨2026年人工智能、大数据与电气自动化国际学术会议(CWMCAIBDEA 2026)
  • 大模型技术路线图:Transformer已不再是唯一选择,多方博弈下的未来趋势解读!
  • 终极指南:如何用DellFanManagement彻底解决戴尔笔记本风扇噪音问题
  • Raspberry Pi Zero 2 W功耗优化与测试指南
  • 动麦优化算法(Animated Oat Optimization Algorithm, AOO)性能测试,包含种群分布图、全局搜索图、局部搜索图、目标收敛图、评价适应度图、单维目标迭代图,MATLAB
  • 魔兽争霸3兼容性修复终极指南:用WarcraftHelper解决现代系统问题
  • 基于SpringBoot智能化体育馆管理系统(附源码+文档+数据库,一键运行)
  • Flutter 鸿蒙应用列表性能优化实战:虚拟列表+分页加载+渲染优化,实现60fps丝滑滚动
  • 一文读懂开源协议:MIT、GPL-3.0、Apache 2.0 到底怎么选?
  • 深度解析Universal Android Debloater:无需Root的安卓系统瘦身终极指南
  • LeanClaw:构建安全高效的本地AI助手运行时架构与实践
  • 5分钟掌握TranslucentTB:让你的Windows任务栏瞬间变透明的终极美化方案
  • 基于AI智能体的学生任务管理助手:从架构设计到部署实践