• 力扣第1047题 删除字符串中的所有相邻重复项 c++string stack巧解


    题目

    1047. 删除字符串中的所有相邻重复项

    简单

    给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

    在 S 上反复执行重复项删除操作,直到无法继续删除。

    在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

    示例:

    输入:"abbaca"
    输出:"ca"
    解释:
    例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
    

    提示:

    1. 1 <= S.length <= 20000
    2. S 仅由小写英文字母组成。

    思路和解题方法一

    stack

    1. 首先,创建一个字符栈 st 用于存储非重复的字符。
    2. 然后,对输入字符串 S 进行遍历,对于字符串中的每个字符 s
    •         如果栈为空或当前字符 s 与栈顶字符不相同,则将当前字符 s 入栈,以保留非重复的字符。
    •         如果当前字符 s 与栈顶字符相同,则将栈顶字符出栈,即删除相邻重复字符。
    1. 遍历结束后,栈中存储的字符就是去除相邻重复字符的结果。
    2. 接下来,创建一个空的字符串 result 用于存储最终的结果。
    3. 使用一个循环,将栈中剩余的字符依次出栈,并将它们加入到结果字符串 result 的末尾。
    4. 由于栈中字符的顺序与原字符串相反,因此最后需要使用 reverse 函数将结果字符串反转,以得到正确的顺序。
    5. 最后,返回反转后的结果字符串即可。

    复杂度

            时间复杂度:

                    O(n)n

            O(n),其中n是输入字符串的长度。这是因为代码通过一次遍历将字符串中的字符入栈或出栈,所以总的操作次数与字符串的长度成线性关系。

            空间复杂度

                    O(n)

            空间复杂度上,使用了一个字符栈来存储非重复的字符。在最坏情况下,当输入字符串中的字符全部都不相邻重复时,栈的大小将达到输入字符串的长度。因此,空间复杂度为O(n),其中n是输入字符串的长度。

    c++ 代码

    1. class Solution {
    2. public:
    3. string removeDuplicates(string S) {
    4. stack<char> st; // 创建一个字符栈用于存储非重复的字符
    5. for (char s : S) { // 遍历输入字符串的每个字符
    6. if (st.empty() || s != st.top()) {
    7. st.push(s); // 如果栈为空或当前字符与栈顶字符不相同,则将当前字符入栈
    8. } else {
    9. st.pop(); // 如果当前字符与栈顶字符相同,则将栈顶字符出栈,即删除相邻重复字符
    10. }
    11. }
    12. string result = "";
    13. while (!st.empty()) { // 将栈中剩余的字符放到结果字符串中
    14. result += st.top();
    15. st.pop();
    16. }
    17. reverse(result.begin(), result.end()); // 反转字符串,因为栈中字符的顺序与原字符串相反
    18. return result;
    19. }
    20. };

    思路和解题方法二

    1. 首先,创建一个空字符串 result 用于存储最终的结果。
    2. 然后,使用一个循环遍历输入字符串 S 的每个字符 s
    3. 在每次迭代中,我们检查 result 是否为空,或者 result 的最后一个字符与当前字符 s 是否相同。如果是,则说明有相邻重复字符,我们将 result 的最后一个字符移除,即调用 result.pop_back()。如果不是,则说明没有相邻重复字符,我们将当前字符 s 添加到 result 的末尾,即调用 result.push_back(s)
    4. 最后,循环结束后,result 中存储的就是去除相邻重复字符的结果。
    5. 返回 result 即可作为最终的结果。

    复杂度

            时间复杂度:

                    O(n)

    O(n),其中 n 是字符串的长度。因为我们需要遍历输入字符串中的每个字符。

            空间复杂度

                    O(1)

    空间复杂度: O(1),leetcode返回值不计空间复杂度。

    c++ 代码

    1. class Solution {
    2. public:
    3. string removeDuplicates(string S) {
    4. string result;
    5. for(char s : S) {
    6. if(result.empty() || result.back() != s) { // 如果result为空或者result的最后一个字符与当前字符s不相同
    7. result.push_back(s); // 将当前字符s添加到result的末尾
    8. }
    9. else { // 如果result的最后一个字符与当前字符s相同
    10. result.pop_back(); // 移除result的最后一个字符
    11. }
    12. }
    13. return result; // 返回去重后的结果字符串
    14. }
    15. };

    觉得有用的话可以点点赞,支持一下。

    如果愿意的话关注一下。会对你有更多的帮助。

    每天都会不定时更新哦  >人<  。

  • 相关阅读:
    【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下
    PGSQL的on conflict
    谷粒学苑_第九天
    leetcode1092. 最短公共超序列(java-动态规划)
    压力测试-JMeter的多种形式参数化
    网页翻译软件-网页自动采集翻译软件免费
    AlexNet重点介绍和源码测试
    基于大数据的学习资源推送系统
    Android 多线程、线程池
    [附源码]java毕业设计停车场信息管理系统
  • 原文地址:https://blog.csdn.net/jgk666666/article/details/133444165