代码随想录二刷-栈和队列章节
1047:删除字符串中的所有相邻重复项
链接: Leetcode1047.删除字符串中的所有相邻重复项
类似题目:代码随想录二刷-有效的括号
题目需求
1.给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
2.在 S 上反复执行重复项删除操作,直到无法继续删除。
3.在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
思路
-
分析题干
a. 题目要求的是把重复项删除后的字符串,删除操作的对象是相邻且相同的字母。【第一步】
b. 也就是说,如果当前字母为b,下个字母还是b的话,就要将b删除。【第二步】
c. 把字母替换为括号,这里的重复项删除是不是就与括号匹配的情况相对应了。【第三步】
d.把不熟悉转为熟悉。可以使用代码随想录二刷-有效的括号思路去做【第四步】 -
写题顺序
a. 创建一个栈
b. 遍历字符串,遇到重复项,把重复项出栈
c. 最后留在栈里的字符,弹出打印,作为结果 -
注意事项
a. 最后出栈的时候,要记得对字符串反转。原因是栈是先进后出。所以出栈后得到的字符串是倒序的。 -
代码
class Solution {
public:
string removeDuplicates(string s) {
stack<char> sta;
for(int i = 0; i < s.size(); ++i){
if(!sta.empty()){
if(sta.top() == s[i]) sta.pop();
else sta.push(s[i]);
}
else sta.push(s[i]);
}
// 出栈打印
string res = "";
while(!sta.empty()){
res += sta.top();
sta.pop();
}
// 由于栈是先进后出,res是倒序的,所以要翻转一下
reverse(res.begin(), res.end());
return res;
}
};