相邻重复字母删除问题及有效的括号问题 | 豆包MarsCode AI刷题

115 阅读3分钟

问题描述

小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(nn)
  • 空间复杂度: O(nn)

相似题目

  • 20. 有效的括号 - 力扣(LeetCode)
  • 题目描述:给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:1. 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。3. 每个右括号都有一个对应的相同类型的左括号。
  • 解题思路:这道题和相邻重复字母删除问题都可以用栈解决,有效的括号如果遍历元素c和栈顶元素对称,那么将栈顶元素弹出,否则将遍历元素c入栈。如果遍历过程中出现栈为空或括号不匹配的情况,那么括号字符串不是有效的。如果遍历完成后栈为空,说明括号字符串是有效的。
  • 可以试试这道题。