一、今日学习的文章链接和视频链接
题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
视频讲解:https://www.bilibili.com/video/BV12a411P7mw
二、自己看到题目的第一想法
看到题目要反复删除相邻且相同的字母,直到不能删为止,第一反应就是用栈!
因为删除相邻重复项,完美匹配栈“先进后出、检查栈顶”的特性。
思路:遍历字符串,当前字符和栈顶相同就弹出(删除),不同就入栈,最后栈里就是答案。
三、自己实现过程中遇到哪些困难
1. 栈为空时访问 top() 崩溃
一开始没判断栈空,直接取栈顶比较,程序直接报错。
2. 忘记最后要把栈反转/拼接成字符串
栈是倒序的,最后要遍历栈输出字符串,一开始直接输出乱了。
3. 误以为只删一次重复
题目要求反复删除,直到不能删,栈正好能处理这种连锁删除。
四、今日收获心得
彻底掌握了删除相邻重复项的栈解法,时间 O(n),空间 O(n),最简洁最优!
核心思想:
- 栈顶 == 当前字符 → 消除(pop)
- 栈顶 != 当前字符 → 保留(push)
#include <stack> using namespace std; class Solution { public: string removeDuplicates(string s) { stack<char> st; for (char c : s) { // 栈不为空 且 栈顶 == 当前字符 → 删除 if (!st.empty() && st.top() == c) { st.pop(); } else { st.push(c); } } // 把栈转为字符串 string res = ""; while (!st.empty()) { res = st.top() + res; st.pop(); } return res; } };