问题描述
小M拿到了一个由小写字母组成的字符串
s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在s上反复进行此操作,直到无法再删除任何字母。 请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。
解题思路
- 栈的特点是后进先出,利用这一特性解决问题。遍历整个字符串,设当前遍历的字符为c,如果栈不为空并且栈顶元素和c相同,那么说明这两个相邻元素相同,弹出栈顶元素。如果栈为空那么直接入栈。如果栈不为空且栈顶元素不等于元素c,将元素c入栈,遍历完成后能够删除所有直接或间接相邻的相同元素。
- 以
s = "abbaca"为例,创建空栈stack,当遍历第一个字符'a'时,栈为空,将字符'a'入栈,此时stack=['a'] - 第二个字符
'b',栈不为空,但栈顶元素'a'不等于字符'b',因此将字符'b'入栈,此时stack=['a','b'] - 第三个字符
'b',栈不为空,栈顶元素'b'等于字符'b',因此弹出栈顶元素'b',此时stack=['a'] - 第四个字符
'a',栈不为空,栈顶元素'a'等于字符'a',因此弹出栈顶元素'a',此时stack=[] - 第五个字符
'c',栈为空,将字符'c'入栈,此时stack=['c'] - 第六个字符
'a',栈不为空,当栈顶元素'c'不等于元素'a',因此将字符'a'入栈,此时stack=['c','a'] - 遍历完字符串
s,将栈stack=['c', 'a']转换成字符串"ca",得到答案
def solution(s: str) -> str:
# 定义一个栈,判断相邻元素是否相同
stack = []
# 遍历整个列表
for c in s:
# 如果栈不为空,那么说明元素c之前还有元素。如果栈顶元素与元素c相同,那么弹出栈顶元素
if stack and stack[-1] == c:
stack.pop()
# 否则,说明没有相邻元素或相邻元素不相同,直接入栈
else:
stack.append(c)
# 最后将栈转换成字符串,满足函数的返回类型
return "".join(stack)
复杂度
- 时间复杂度: O()
- 空间复杂度: O()
相似题目
- 20. 有效的括号 - 力扣(LeetCode)
- 题目描述:给定一个只包括
'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:1. 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。3. 每个右括号都有一个对应的相同类型的左括号。 - 解题思路:这道题和相邻重复字母删除问题都可以用栈解决,有效的括号如果遍历元素c和栈顶元素对称,那么将栈顶元素弹出,否则将遍历元素c入栈。如果遍历过程中出现栈为空或括号不匹配的情况,那么括号字符串不是有效的。如果遍历完成后栈为空,说明括号字符串是有效的。
- 可以试试这道题。