C++算法练习-day24——1047.删除字符串中的所有相邻重复项

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求从一个字符串中移除所有相邻的重复字符,只保留一个。例如,输入字符串 "abbaca" 应该返回 "ca",因为在移除所有相邻的重复字符后,只剩下 'c' 和 'a'。

这个问题可以通过使用栈(Stack)数据结构来解决。栈是一种后进先出(LIFO)的数据结构,非常适合处理这种需要回溯的场景。具体思路如下:

  1. 遍历输入字符串的每个字符。
  2. 对于每个字符,检查栈顶元素是否与之相同。
    • 如果相同,说明是相邻的重复字符,从栈中弹出栈顶元素。
    • 如果不同,将当前字符压入栈中。
  3. 遍历结束后,栈中剩下的字符即为移除所有相邻重复字符后的结果。

代码:

#include <string>  
#include <stack>  
  
class Solution {  
public:  
    // 定义一个函数,用于移除字符串中的相邻重复字符  
    string removeDuplicates(string s) {  
        // 创建一个空栈,用于存储处理后的字符  
        string stk;  
          
        // 遍历输入字符串的每个字符  
        for(char e : s){  
            // 检查栈是否为空以及栈顶元素是否与当前字符相同  
            if(!stk.empty() && stk.back() == e){  
                // 如果相同,从栈中弹出栈顶元素(移除相邻重复字符)  
                stk.pop_back();  
            } else {  
                // 如果不同,将当前字符压入栈中  
                stk.push_back(e);  
            }  
        }  
          
        // 返回栈中剩余的字符,即为移除相邻重复字符后的结果  
        return stk;  
    }  
};

注释详解

  1. 类定义class Solution 定义了一个解决方案类。
  2. 函数定义string removeDuplicates(string s) 定义了一个成员函数,用于移除字符串中的相邻重复字符。
  3. 栈初始化string stk; 使用一个字符串来模拟栈的行为,因为字符串的 back() 和 pop_back() 方法可以方便地访问和移除最后一个元素。
  4. 遍历字符串for(char e : s) 使用范围基于的 for 循环遍历输入字符串的每个字符。
  5. 检查栈顶元素if(!stk.empty() && stk.back() == e) 检查栈是否为空以及栈顶元素是否与当前字符相同。
  6. 弹出栈顶元素stk.pop_back(); 如果栈顶元素与当前字符相同,则弹出栈顶元素。
  7. 压入栈中stk.push_back(e); 如果栈顶元素与当前字符不同,则将当前字符压入栈中。
  8. 返回结果return stk; 返回栈中剩余的字符,即为移除相邻重复字符后的结果。

知识点摘要

  • 栈(Stack):一种后进先出(LIFO)的数据结构,常用于解决需要回溯的问题。
  • 字符串操作back() 方法用于访问字符串的最后一个字符,pop_back() 方法用于移除字符串的最后一个字符。
  • 范围基于的 for 循环:用于遍历容器(如字符串、数组等)中的每个元素。

通过本题,我们学习了如何使用栈数据结构来解决移除相邻重复字符的问题。栈的 LIFO 特性使得它能够高效地处理这种需要回溯的场景。此外,我们还复习了字符串的基本操作方法以及范围基于的 for 循环的使用。这种解题思路不仅适用于本题,还可以扩展到其他需要处理相邻元素关系的场景中,是一种非常实用的算法技巧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值