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

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

题目链接: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. 对 "消除类" 问题的思维拓展 原来以为 "重复消除" 需要多次遍历字符串,现在发现用栈可以一次遍历完成所有消除操作,这种思路也启发了我对后续类似题目(比如消除相邻相同字符、字符串匹配)的思考,学会了用栈来简化复杂的重复处理逻辑。
相关推荐
小O的算法实验室2 小时前
2026年AST,复杂边界环境下多无人机协同搜索攻击+分形智能自组织任务规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
测绘第一深情2 小时前
租用GPU云服务器进行深度学习(AutoDL,超保姆级,适用新手)
数据结构·人工智能·经验分享·python·深度学习·算法·计算机视觉
北顾笙9802 小时前
day34-数据结构力扣
数据结构·算法·leetcode
khalil10202 小时前
代码随想录算法训练营Day-36动态规划04 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零
算法·动态规划
码农爱学习2 小时前
用cJson的例子,来理解二级指针
算法
自我意识的多元宇宙2 小时前
【数据结构】二叉排序树
数据结构·算法
量子炒饭大师2 小时前
【优化算法:双指针算法刷题宝典】—— 盛最多水的容器
c++·算法
IT猿手2 小时前
多无人机动态避障路径规划研究:基于壁虎优化算法GJA的多无人机动态避障路径规划研究(可以自定义无人机数量及起始点),MATLAB代码
算法·matlab·无人机
listhi5202 小时前
MATLAB电力系统加权最小二乘法(WLS)状态估计
算法·matlab·最小二乘法