1047 删除字符串中的所有相邻重复项
题目 1047 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
思路
用栈结构哈,很简单,画个图自己试试就知道了。
循环字符串,进栈一个元素,第二个字符串元素对比栈顶元素,如果相等,弹出栈元素,如果不相等,则该元素也入栈,接着循环下一个字符串元素。
代码
class Solution:
def removeDuplicates(self, s: str) -> str:
if len(s) <= 1:
return s
stack = []
stack.append(s[0])
for i in range(1, len(s)):
# 考虑栈不为空的时候才能弹出,万一中间都抵消了栈为空了呢对吧
if stack != [] and s[i] == stack[-1]:
stack.pop()
else:
stack.append(s[i])
return "".join(stack) # 因为栈用的列表定义的,所以没有循环弹出栈元素,进行翻转了。