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

从零开始刷算法-栈-括号匹配

题目理解

我们需要判断一个字符串中的括号是否成对且顺序匹配,比如:

输入:"({[]})" → true
输入:"([)]"   → false

从直觉上,这就是“遇到左括号就入栈,遇到右括号就出栈匹配”的过程。栈这种后进先出(LIFO)的结构,天然适合这种成对匹配的问题。

解题核心思路

  1. 遇到左括号:入栈

  2. 遇到右括号:检查栈顶是否匹配

    • 栈空:说明多了右括号(例如 ")("

    • 不匹配:说明类型不对(例如 "(]"

  3. 遍历完后,栈必须为空
    如果还剩左括号没匹配上,那也是不合法的。


关于 unordered_map 的关键设计

很多题解都是这样定义:

unordered_map<char, char> mp = {{')', '('}, {']', '['}, {'}', '{'}};

这表示「右括号」是 key,「左括号」是 value。
为什么不反过来写?

因为我们匹配动作发生在遇到右括号时:

if (mp.contains(c)) { // c 是右括号// 取出对应的左括号if (st.empty() || st.top() != mp[c]) return false;st.pop();
}

也就是说,我们要通过当前的右括号 c 找到它应当匹配的左括号 mp[c]
所以 key 必须是右括号,这是逻辑上最自然的一种映射方式。

代码实现

class Solution {// 思路: 遇到左括号进stack,遇到右边出stackunordered_map<char, char> mp = {{')', '('}, {']', '['}, {'}', '{'}}; 
public:bool isValid(string s) {if (s.length() % 2) return false; // 奇数长度一定不匹配stack<char> st;for (char c : s) {if (!mp.contains(c)) {// 左括号入栈st.push(c);} else {// 右括号时进行匹配if (st.empty() || st.top() != mp[c]) {// 注意这里 empty() 要放在前面!return false;}st.pop();}}return st.empty(); // 最后栈必须为空}
};

两个易错点总结

  1. 奇数长度直接返回 false
    因为每对括号都需要两个字符。

  2. st.empty() 判断要放在前面
    否则会先访问 st.top() 导致越界错误。

小结

这个题其实是典型的**“栈 + 哈希”组合拳**:

  • 哈希表解决“匹配关系”;

  • 解决“嵌套顺序”;

  • 顺序遍历 + 条件判断解决逻辑控制。

我认为它最大的难点不在代码,而在对操作顺序的理解反转
从“左括号匹配右括号”,到“右括号查找左括号”,这个思维变化一旦想通,后续几乎所有类似题都能一通百通。

http://www.dtcms.com/a/569175.html

相关文章:

  • 走进Linux的世界:初识进程(Task)
  • 首钢建设集团山东公司网站2017年网站建设公司
  • 让数据库更智能-大模型如何优化我们的SQL查询
  • 什么程序做网站容易优化apache和wordpress
  • NLP自然语言处理Bert大模型系列学习
  • 数据科学每日总结--Day10--数据库
  • 【实战】自然语言处理--长文本分类(3)HAN算法
  • 中国建设工程招投网站网站后台登陆口
  • 学校网站建设招聘电商推广计划
  • Ubuntu 20.04 系统库管理详细教程
  • [jmeter-商城测试]
  • Kubernetes包管理利器:Helm核心功能与架构解析指南
  • 17、docker-macvlan-1-理论
  • Mac M系列芯片制作Oracle19镜像使用docker-compose运行
  • Linux source命令详解与应用场景
  • Verilog学习 有限状态机
  • 企业网站备案审核需要多长时间沧州大型企业网站建设
  • Figma高效开发工具链:从设计到测试的完整解决方案
  • React(二):构建一个简单的聊天助手学到的React知识
  • seo优化网站的注意事项北京网络职业学院
  • JWT的说明和使用
  • MFC - 使用 Base64 对图片进行加密解密
  • Git+SSH 实现控制分支的提交权限
  • 网站建设选择题网站的内容建设
  • 怎么用自己电脑做网站服务器刚做淘客没有网站
  • CUDA C++编程指南(3.1)——使用NVCC编译
  • Numpy学习总结
  • 可梦AI获首批企业好评,蜜糖网络入驻共启AI短剧工业化
  • 笔记跨设备无缝切换?Joplin+cpolar让多设备同步更自由
  • Swift 6.2 列传(第四篇):enumerated () 的 “集合神功”