题目(leecode T1047):
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
方法:删除相邻的重复字符,我们可以用栈来处理,遍历字符串时,匹配当前字符与栈顶的字符是否相同,如果相同的话,就代表他们是相邻的重复字符,那我们就把当前栈顶的元素给弹出栈。因为他是重复的元素,我们的栈里最后只放不重复的最终结果。但如果不相等的话,我们就直接将字符入栈。重复此过程直到结束,最后栈中留下的就是已经删除完所有重复元素的字符串了。我们只需要将所有的元素都弹出到结果串中,但因为栈是先进后出的结构,所以最后弹出的结果,我们需要再进行逆置的处理就是最终的结果。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for (char i : s) {
if(st.empty() || i != st.top()){
st.push(i);
}else{
st.pop();
}
}
string result = "";
while (!st.empty()) { // 将栈中元素放到result结果串
result += st.top();
st.pop();
}
reverse (result.begin(), result.end()); // 字符串需要逆置
return result;
}
};