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)  # 因为栈用的列表定义的,所以没有循环弹出栈元素,进行翻转了。
posted @ 2022-10-27 21:51  时光如你般美好  阅读(19)  评论(0编辑  收藏  举报