题目来源:. - 力扣(LeetCode)
题目思路分析
题目要求从一个字符串中移除所有相邻的重复字符,只保留一个。例如,输入字符串 "abbaca" 应该返回 "ca",因为在移除所有相邻的重复字符后,只剩下 'c' 和 'a'。
这个问题可以通过使用栈(Stack)数据结构来解决。栈是一种后进先出(LIFO)的数据结构,非常适合处理这种需要回溯的场景。具体思路如下:
- 遍历输入字符串的每个字符。
- 对于每个字符,检查栈顶元素是否与之相同。
- 如果相同,说明是相邻的重复字符,从栈中弹出栈顶元素。
- 如果不同,将当前字符压入栈中。
- 遍历结束后,栈中剩下的字符即为移除所有相邻重复字符后的结果。
代码:
#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;
}
};
注释详解
- 类定义:
class Solution定义了一个解决方案类。 - 函数定义:
string removeDuplicates(string s)定义了一个成员函数,用于移除字符串中的相邻重复字符。 - 栈初始化:
string stk;使用一个字符串来模拟栈的行为,因为字符串的back()和pop_back()方法可以方便地访问和移除最后一个元素。 - 遍历字符串:
for(char e : s)使用范围基于的 for 循环遍历输入字符串的每个字符。 - 检查栈顶元素:
if(!stk.empty() && stk.back() == e)检查栈是否为空以及栈顶元素是否与当前字符相同。 - 弹出栈顶元素:
stk.pop_back();如果栈顶元素与当前字符相同,则弹出栈顶元素。 - 压入栈中:
stk.push_back(e);如果栈顶元素与当前字符不同,则将当前字符压入栈中。 - 返回结果:
return stk;返回栈中剩余的字符,即为移除相邻重复字符后的结果。
知识点摘要
- 栈(Stack):一种后进先出(LIFO)的数据结构,常用于解决需要回溯的问题。
- 字符串操作:
back()方法用于访问字符串的最后一个字符,pop_back()方法用于移除字符串的最后一个字符。 - 范围基于的 for 循环:用于遍历容器(如字符串、数组等)中的每个元素。
通过本题,我们学习了如何使用栈数据结构来解决移除相邻重复字符的问题。栈的 LIFO 特性使得它能够高效地处理这种需要回溯的场景。此外,我们还复习了字符串的基本操作方法以及范围基于的 for 循环的使用。这种解题思路不仅适用于本题,还可以扩展到其他需要处理相邻元素关系的场景中,是一种非常实用的算法技巧。
748

被折叠的 条评论
为什么被折叠?



