解决字符串删除相邻重复字符问题//学习笔记//豆包MarsCode AI刷题

124 阅读3分钟

解决字符串删除相邻重复字符问题

问题描述:

你可能遇到过这样的字符串处理问题:

给定一个由小写字母组成的字符串 s,可以反复进行以下操作:选择两个相邻且相同的字母并删除它们。你的任务是返回在不断删除操作之后,剩下的字符串。

示例:

  • 输入:s = "abbaca" 输出:"ca"
  • 输入:s = "azxxzy" 输出:"ay"
  • 输入:s = "a" 输出:"a"

解题思路:

这个问题的核心思路是通过 来模拟删除相邻重复字符的过程。栈这种数据结构非常适合解决此类问题,因为它支持后进先出的操作,能够高效地处理字符的删除操作。

具体步骤:

  1. 遍历字符串 s 中的每个字符。

  2. 使用栈保存字符:

    • 如果当前字符与栈顶字符相同,说明找到了相邻的重复字符,我们就删除这对字符(即从栈中弹出栈顶字符)。
    • 如果当前字符与栈顶字符不同,则将当前字符压入栈中。
  3. 遍历完成后,栈中剩余的字符就是没有相邻重复字符的字符串。

为什么栈适合这种操作?

  • 栈是一个 后进先出 的数据结构,每次处理字符时,都是与栈顶的字符进行比较。这样就能快速检测到相邻重复字符并进行删除。

算法实现:

python
复制代码
def solution(s: str) -> str:
    stack = []
    
    for char in s:
        # 如果栈顶字符和当前字符相同,则弹出栈顶字符
        if stack and stack[-1] == char:
            stack.pop()
        else:
            # 否则将当前字符压入栈中
            stack.append(char)
    
    # 将栈中的字符拼接成最终字符串并返回
    return ''.join(stack)

代码解析:

  1. 初始化栈

    • 我们使用一个空的栈 stack 来存储字符。
  2. 遍历字符串

    • 对于字符串中的每个字符 char

      • 如果栈不为空,并且栈顶的字符和当前字符相同,说明找到了相邻的重复字符,弹出栈顶字符。
      • 如果栈为空或者栈顶字符和当前字符不同,则将当前字符压入栈中。
  3. 返回结果

    • 遍历完字符串后,栈中的字符即为没有重复项的结果。我们将栈中的字符通过 ''.join(stack) 拼接成一个字符串并返回。

示例运行:

python
复制代码
# 示例1
print(solution("abbaca"))  # 输出:"ca"

# 示例2
print(solution("azxxzy"))  # 输出:"ay"

# 示例3
print(solution("a"))       # 输出:"a"

时间复杂度分析:

  • 时间复杂度是 O(n),其中 n 是字符串 s 的长度。我们只遍历一次字符串,并且每个字符的栈操作(压入和弹出)都是 O(1)。

空间复杂度分析:

  • 空间复杂度是 O(n),其中 n 是字符串的长度。最坏情况下(没有任何重复字符),栈可能会存储所有的字符。