LC.1047 | 删除字符串中的所有相邻重复项 | 栈 | 字符串操作

输入:一个由小写英文字母组成的字符串 $s$

要求:执行重复删除操作:选择两个相邻且相同的字母并删除它们。这个操作可以在剩余的字符串上重复执行,直到无法继续删除为止。 返回完成所有重复项删除操作后得到的最终字符串。答案保证唯一。

输出:一个字符串,表示最终的结果


思路:有点像连连对消除,两个一消除,还容易引起连锁反应,使用栈处理挺好。(当然直接用string 模拟栈,代码更简洁,最后返回ans的时候,可以省去出栈及reverse环节。)

  1. 遍历输入字符串:依次读取输入字符串 s中的每个字符 c。

  2. 判断与栈顶的关系

    • 如果栈为空,或当前字符 c与栈顶字符不相同,则将 c压入栈中。

    • 如果当前字符 c 与栈顶字符相同,则说明发现了一对相邻重复项,应执行删除操作。由于栈顶元素是上一个未被删除的字符,我们将栈顶元素弹出,相当于删除了这对重复项。


复杂度:

        时间复杂度:O(n)

        空间复杂度:O(n)


 class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> tmp;
        for (int i = 0; i < s.size(); i++) {
            if (tmp.empty() || s[i] != tmp.top()) {
                tmp.push(s[i]);
            }
            else {
                char t = tmp.top();
                tmp.pop();
            }
        }
        string ans;
        while (!tmp.empty()) {
            ans += tmp.top();
            tmp.pop();
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值