LeetCode - 1047. 删除字符串中的所有相邻重复项
题目
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
思路与过程
这是一个典型的栈应用问题。我们可以用栈来跟踪字符,当遇到与栈顶相同的字符时,就将栈顶元素弹出(相当于删除这对相邻重复项)。
核心思想
- 遍历字符串中的每个字符
- 如果当前字符与栈顶字符相同,则将栈顶字符弹出(删除这对相邻重复项)
- 否则,将当前字符入栈
- 最后,栈中剩余的字符就是结果
详细过程
以输入 "abbaca" 为例:
初始状态:栈为空
处理字符 'a':
- 栈为空,将 'a' 入栈
- 栈:['a']
处理字符 'b':
- 栈顶是 'a',与 'b' 不同,将 'b' 入栈
- 栈:['a', 'b']
处理字符 'b':
- 栈顶是 'b',与当前字符 'b' 相同,弹出栈顶
- 栈:['a']
处理字符 'a':
- 栈顶是 'a',与当前字符 'a' 相同,弹出栈顶
- 栈:[](空栈)
处理字符 'c':
- 栈为空,将 'c' 入栈
- 栈:['c']
处理字符 'a':
- 栈顶是 'c',与 'a' 不同,将 'a' 入栈
- 栈:['c', 'a']
最终栈中的字符:['c', 'a']
将栈中元素从底到顶组成字符串:"ca"
可能出现的错误写法
class Solution {
public:string removeDuplicates(string s) {stack<char> st;string result;if(s.empty()){return s;}for(int i = 0; i< s.size();i++){if(s[i] == st.top()){st.pop();}else{st.push(s[i]);}}while(!st.empty()){result.push_back(st.top());st.pop();}return result;}
};
栈为空时访问栈顶:即使你检查了输入字符串 s 是否为空,但在第一次迭代时,栈 st 仍然是空的。当你尝试访问 st.top() 时,如果栈为空,这会导致未定义行为。
结果顺序问题:从栈中弹出元素的顺序与它们在原始字符串中的顺序相反,所以最终结果需要反转。
正确的写法
class Solution {
public:string removeDuplicates(string s) {stack<char> st;string result;if(s.empty()){return s;}for(int i = 0; i< s.size();i++){if(!st.empty() && s[i] == st.top()){st.pop();}else{st.push(s[i]);}}while(!st.empty()){result.push_back(st.top());st.pop();}reverse(result.begin(),result.end());return result;}
};