难度参考
难度:中等
分类:栈与队列
难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨在督促自己认真学习。
题目
给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们,在S上反 复执行重复项删除操作,直到无法继续删除,在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例1: 输入:"abbaca"
输出:"ca"
解释:例如,在"abbaca"中,我们可以删除"bb"由于两字母相邻且相同,这是此时唯一可以执行删除操作的重 复项。之后我们得到字符串"aaca",其中又只有"aa"可以执行重复项删除操作,所以最后的字符串为"ca"。
提示: 1<=S.length<=20000 ·S仅由小写英文字母组成。
思路
这段代码的目标是删除字符串中的重复项,重复项是相邻且相同的字符。代码使用了一个空的字符串 result
作为暂存,遍历输入字符串 S
中的每个字符,根据不同情况来操作 result
字符串。
算法思路如下:
- 创建一个空字符串
result
,用于存储最终的结果。 - 遍历输入字符串
S
中的每个字符ch
。 - 如果
result
不为空且result
的最后一个字符和当前字符ch
相同,则遇到了重复项。将重复项删除,即将result
的最后一个字符弹出。 - 如果当前字符
ch
不和result
的最后一个字符相同,将当前字符添加到result
的末尾。 - 返回最终的结果字符串
result
。
该算法的时间复杂度是 O(n),其中 n 是字符串 S
的长度。
示例
输入:字符串 S = "abbaca"
-
开始时,创建一个空字符串
result
,用于存储最终结果。 -
开始遍历字符串
S
中的每个字符:- 当前字符
ch = 'a'
,由于result
是空的,直接把'a'
加入到result
中。result={a} a,b,b,a,c,a ^
- 当前字符
ch = 'b'
,由于result
的最后一个字符不是'b'
,所以把'b'
加入到result
中。result={a,b} a,b,b,a,c,a ^
- 当前字符
ch = 'b'
,由于result
的最后一个字符是'b'
,所以把result
的最后一个字符弹出,此时result
变为"a"
。result={a} a,b,b,a,c,a ^
- 当前字符
ch = 'a'
,由于result
的最后一个字符是'a'
,所以再次把result
的最后一个字符弹出,此时result
变为空。result={ } a,b,b,a,c,a ^
- 当前字符
ch = 'c'
,由于result
是空的,直接把'c'
加入到result
中。result={c} a,b,b,a,c,a ^
- 当前字符
ch = 'a'
,由于result
是空的,直接把'a'
加入到result
中。result={c,a} a,b,b,a,c,a ^
- 当前字符
-
结束遍历。
-
返回最终的结果字符串
result = "ca"
。
梳理
这段代码之所以能够实现删除字符串中的重复项,是因为它利用了栈的特性来判断相邻字符是否相同。
具体来说,代码遍历输入字符串 `S` 中的每个字符,并将每个字符与 `result` 的最后一个字符进行比较。如果它们相同,则说明遇到了重复项,我们需要将 `result` 的最后一个字符弹出。否则,当前字符不是重复项,我们将其添加到 `result` 的末尾。通过这样的逻辑,我们可以确保 `result` 中不会包含相邻且相同的字符。
这种方法利用了栈的先进后出的特性,我们可以将 `result` 视为一个栈。当遇到重复项时,我们将栈顶的元素弹出,相当于将重复项从栈中删除。不断重复这个过程,直到没有重复项为止,最终得到的 `result` 就是删除了重复项的结果。
通过以上方式,这段代码能够有效地删除字符串中的重复项。
代码
#include <iostream>
#include <string>
using namespace std;
string removeDuplicates(string S) {
// 创建一个空字符串 result,用于存储最终的结果
string result;
// 遍历输入字符串 S 中的每个字符 ch
for (char ch : S) {
// 如果 result 不为空且 result 的最后一个字符和当前字符相同,则遇到了重复项
if (!result.empty() && result.back() == ch) {
// 将重复项删除,即将 result 的最后一个字符弹出
result.pop_back();
} else {
// 当前字符不和 result 的最后一个字符相同,将当前字符添加到 result 的末尾
result.push_back(ch);
}
}
// 返回最终的结果字符串 result
return result;
}
int main() {
// 输入字符串
string input = "abbaca";
// 调用 removeDuplicates 函数并获取结果
string output = removeDuplicates(input);
// 输出结果字符串
cout << output << endl;
return 0;
}