第十九天 删除字符串中的所有相邻重复项 栈的经典应用。

要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。

题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/ 视频讲解:https://www.bilibili.com/video/BV12a411P7mw

一、看到题目的第一想法

  1. 题目要求理解 :给定一个字符串 s,重复删除两个相邻且相同的字符,直到字符串中没有这样的相邻重复项为止,返回最终的字符串。比如 "abbaca" 最终会变成 "ca"。
  2. 核心思路 :这道题是典型的栈 应用场景,栈的 "后进先出" 特性正好可以处理相邻匹配的问题:
    • 遍历字符串,把每个字符依次压入栈中;
    • 每次压栈前,先检查栈顶元素是否和当前字符相同:如果相同,说明是相邻重复项,直接弹出栈顶(相当于删除这对重复字符);如果不同,就把当前字符压入栈中;
    • 遍历结束后,栈中剩下的字符就是没有相邻重复项的字符串。
  3. 初步实现念头 :
    • 直接用 string 模拟栈操作,用 back() 取栈顶、pop_back() 出栈、push_back() 入栈,非常方便。
    • 遍历每个字符,先判断栈非空且栈顶等于当前字符,是则出栈,否则入栈,最后直接返回栈字符串。

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

  1. 栈空判断的遗漏
    • 一开始写 if (stk.back() == ch) 时,忘记加 !stk.empty() 的判断,当栈为空时访问 stk.back() 会导致程序崩溃,后来才补上了栈非空的前置条件。
  2. 逻辑顺序搞反
    • 一开始错误地把入栈操作写在了前面,再判断是否相等出栈,导致重复字符还是被压入了栈中,比如 "aa" 会被压入两个 'a',后来才纠正了顺序:先判断是否匹配,再决定出栈还是入栈。
  3. 对 "重复删除" 规则的理解偏差
    • 一开始误以为只需要删除一次相邻重复项,而不是重复删除直到没有为止。比如 "abba",一开始以为处理后会变成 "aa",后来才意识到继续处理会变成空字符串,而栈的方式天然支持连续删除,因为每次出栈后,新的栈顶会和下一个字符继续比较。
  4. 边界情况的处理
    • 一开始没考虑空字符串、单个字符的情况,后来发现代码天然处理了这些场景:空字符串直接返回,单个字符会直接入栈,不会触发任何删除操作。

三、今日收获心得

  1. 栈在 "相邻匹配 / 消除" 问题中的通用解法这道题让我深刻体会到,栈不仅能处理括号匹配,还能处理所有 "相邻元素需要成对消除" 的场景。核心思想就是用栈顶元素和当前元素做比较,匹配则消除,不匹配则保留,这种模式可以推广到很多类似的题目中。
  2. 用 string 模拟栈的便捷性 学会了用 string 来模拟栈操作,比使用 std::stack 更方便,因为它本身就支持 back()、pop_back()、push_back() 操作,最后还能直接作为结果返回,省去了栈转字符串的步骤,代码更简洁。
  3. 对算法 "一次遍历" 特性的理解这道题的时间复杂度是 \(O(n)\),每个字符最多入栈和出栈各一次,不需要额外的循环来回处理字符串,这种一次遍历的解法,比暴力的多次扫描删除要高效得多,也让我理解了栈在优化这类问题中的作用。
  4. 边界条件的重要性栈空判断是这类栈应用题目中最容易遗漏的细节,通过这次实现,我养成了 "访问栈顶元素前先判断栈是否为空" 的习惯,避免了程序崩溃的问题。
  5. 对 "消除类" 问题的思维拓展 原来以为 "重复消除" 需要多次遍历字符串,现在发现用栈可以一次遍历完成所有消除操作,这种思路也启发了我对后续类似题目(比如消除相邻相同字符、字符串匹配)的思考,学会了用栈来简化复杂的重复处理逻辑。
相关推荐
机 _ 长几秒前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai1 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码1 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
猿人谷2 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
在猴站学算法4 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
Rainmicro4 小时前
【无标题】
java·数据库·算法
NEFU_Jyj14 小时前
牛客周赛R168
算法