一、题目简述
题目解读:
若不用栈,那肯定很麻烦.实际上还是一个匹配问题,和有效括号匹配一样.
由于题目说,S仅由小写英文字母组成,所以实际上可以用string来模拟一个栈的行为。
个人原本的题解:
class Solution { public: string removeDuplicates(string s) { char ch; stack<int> in; string res=""; for(auto v:s) { if(!in.empty()) //不为空的时候才需要比较 { ch=in.top(); if(ch==v) //相同需要删除->pop()且不在push v即可 { in.pop(); } else //其他情况需要把它加入到栈中 { in.push(v); } } else { in.push(v); } } while(!in.empty()) { char c=in.top(); res+=c; in.pop(); } reverse(res.begin(),res.end()); return res; } };
二、参考思路和题解:
本题也是用栈来解决的经典题目。那么栈里应该放的是什么元素呢?
我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?
所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。然后再去做对应的消除操作。 如动画所示:
从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以在对字符串进行反转一下,就得到了最终的结果。
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s = "hello" ; reverse(s.begin(), s.end()); cout << s <<endl; return 0; }
字符串的反转:
参考代码
class Solution {
public:
string removeDuplicates(string S) {
string result;
for(char s : S) {
if(result.empty() || result.back() != s) {
result.push_back(s);
}
else {
result.pop_back();
}
}
return result;
}
};