问题理解

我们需要删除字符串中所有相邻且相同的字符对,并重复这个过程直到无法继续删除。例如:

  • 输入 "abbaca":

    • 删除 "bb" → "aaca"

    • 删除 "aa" → "ca"(最终结果)

解法思路

使用栈来模拟这个过程:

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

  2. 如果栈不为空且栈顶元素等于当前字符,弹出栈顶元素(表示删除这对相邻重复项)

  3. 否则,将当前字符压入栈中

  4. 最后将栈中剩余字符拼接成字符串返回

class Solution:
    def removeDuplicates(self, s: str) -> str:
        res = list()
        for item in s:
            if res and res[-1] == item:
                res.pop()
            else:
                res.append(item)
        return "".join(res)

这是一个经典的字符串处理问题,可以通过栈(Stack)这种数据结构高效解决。下面我将详细解析这个解法,并分析代码的每一部分。

问题理解

我需要删除字符串中所有相邻且相同的字符对,并重复这个过程直到无法继续删除。例如:

  • 输入 "abbaca":

    • 删除 "bb" → "aaca"

    • 删除 "aa" → "ca"(最终结果)

解法思路

使用栈来模拟这个过程:

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

  2. 如果栈不为空且栈顶元素等于当前字符,弹出栈顶元素(表示删除这对相邻重复项)

  3. 否则,将当前字符压入栈中

  4. 最后将栈中剩余字符拼接成字符串返回

代码解析

class Solution:
    def removeDuplicates(self, s: str) -> str:
        res = list()
        for item in s:
            if res and res[-1] == item:
                res.pop()
            else:
                res.append(item)
        return "".join(res)

示例分析

以输入 "abbaca" 为例:

  1. 'a' → 栈为空 → 压入 ['a']

  2. 'b' → 栈顶 'a' ≠ 'b' → 压入 ['a', 'b']

  3. 'b' → 栈顶 'b' == 'b' → 弹出 → ['a']

  4. 'a' → 栈顶 'a' == 'a' → 弹出 → []

  5. 'c' → 栈为空 → 压入 ['c']

  6. 'a' → 栈顶 'c' ≠ 'a' → 压入 ['c', 'a']
    最终结果:"ca"