力扣第1047题 删除字符串中的所有相邻重复项 c++string stack巧解
题目
简单
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000
S
仅由小写英文字母组成。
思路和解题方法一
用stack
- 首先,创建一个字符栈
st
用于存储非重复的字符。- 然后,对输入字符串
S
进行遍历,对于字符串中的每个字符s
:
- 如果栈为空或当前字符
s
与栈顶字符不相同,则将当前字符s
入栈,以保留非重复的字符。- 如果当前字符
s
与栈顶字符相同,则将栈顶字符出栈,即删除相邻重复字符。
- 遍历结束后,栈中存储的字符就是去除相邻重复字符的结果。
- 接下来,创建一个空的字符串
result
用于存储最终的结果。- 使用一个循环,将栈中剩余的字符依次出栈,并将它们加入到结果字符串
result
的末尾。- 由于栈中字符的顺序与原字符串相反,因此最后需要使用
reverse
函数将结果字符串反转,以得到正确的顺序。- 最后,返回反转后的结果字符串即可。
复杂度
时间复杂度:
O(n)n
O(n),其中n是输入字符串的长度。这是因为代码通过一次遍历将字符串中的字符入栈或出栈,所以总的操作次数与字符串的长度成线性关系。
空间复杂度
O(n)
空间复杂度上,使用了一个字符栈来存储非重复的字符。在最坏情况下,当输入字符串中的字符全部都不相邻重复时,栈的大小将达到输入字符串的长度。因此,空间复杂度为O(n),其中n是输入字符串的长度。
c++ 代码
class Solution {
public:
string removeDuplicates(string S) {
stack<char> st; // 创建一个字符栈用于存储非重复的字符
for (char s : S) { // 遍历输入字符串的每个字符
if (st.empty() || s != st.top()) {
st.push(s); // 如果栈为空或当前字符与栈顶字符不相同,则将当前字符入栈
} else {
st.pop(); // 如果当前字符与栈顶字符相同,则将栈顶字符出栈,即删除相邻重复字符
}
}
string result = "";
while (!st.empty()) { // 将栈中剩余的字符放到结果字符串中
result += st.top();
st.pop();
}
reverse(result.begin(), result.end()); // 反转字符串,因为栈中字符的顺序与原字符串相反
return result;
}
};
思路和解题方法二
- 首先,创建一个空字符串
result
用于存储最终的结果。- 然后,使用一个循环遍历输入字符串
S
的每个字符s
。- 在每次迭代中,我们检查
result
是否为空,或者result
的最后一个字符与当前字符s
是否相同。如果是,则说明有相邻重复字符,我们将result
的最后一个字符移除,即调用result.pop_back()
。如果不是,则说明没有相邻重复字符,我们将当前字符s
添加到result
的末尾,即调用result.push_back(s)
。- 最后,循环结束后,
result
中存储的就是去除相邻重复字符的结果。- 返回
result
即可作为最终的结果。
复杂度
时间复杂度:
O(n)
O(n),其中 n 是字符串的长度。因为我们需要遍历输入字符串中的每个字符。
空间复杂度
O(1)
空间复杂度: O(1),leetcode返回值不计空间复杂度。
c++ 代码
class Solution {
public:
string removeDuplicates(string S) {
string result;
for(char s : S) {
if(result.empty() || result.back() != s) { // 如果result为空或者result的最后一个字符与当前字符s不相同
result.push_back(s); // 将当前字符s添加到result的末尾
}
else { // 如果result的最后一个字符与当前字符s相同
result.pop_back(); // 移除result的最后一个字符
}
}
return result; // 返回去重后的结果字符串
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)