返回

用自己的方式解决 LeetCode 1047:擦除相邻重复项

Android

大家好,欢迎来到我的刷题打卡栏目!今天,我们一起探索 LeetCode 1047:删除字符串中的所有相邻重复项。这道题目看似简单,却暗藏玄机,让我们一起深入探究。

任务简述

给定一个只包含小写字母的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并将其删除。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后,返回最终的字符串。答案保证唯一。

举个例子,对于 S = "abbaca",重复项删除操作会依次进行以下步骤:

  1. 删除 "bb",得到 "aaca"
  2. 删除 "aa",得到 "ca"
  3. 无法再删除,最终结果为 "ca"

我的解题思路

这道题的本质是寻找字符串中相邻的重复项,并将其删除。我们可以采用栈数据结构来解决。

首先,创建一个栈并将其初始化为空。遍历字符串 S,对于每个字符,如果它与栈顶元素相同,则将栈顶元素弹出,表示这两个相邻的字符被删除。否则,将字符压入栈中。

遍历结束后,栈中剩下的字符就是删除所有相邻重复项后的最终结果。

代码实现

def remove_duplicates(s: str) -> str:
    """
    删除字符串中所有相邻重复项
    """
    stack = []
    for char in s:
        if stack and stack[-1] == char:
            stack.pop()
        else:
            stack.append(char)
    return ''.join(stack)

优化技巧

我们还可以对代码进行优化,减少遍历次数。

首先,我们可以使用一个哈希表来记录字符的出现次数。如果一个字符的出现次数大于 1,则将其标记为需要删除。

然后,遍历字符串 S,对于每个字符,如果它被标记为需要删除,则跳过。否则,将其添加到结果字符串中。

例子

def remove_duplicates_optimized(s: str) -> str:
    """
    删除字符串中所有相邻重复项(优化版)
    """
    char_count = {}
    for char in s:
        char_count[char] = char_count.get(char, 0) + 1
    
    result = []
    for char in s:
        if char_count[char] > 1:
            continue
        result.append(char)
    return ''.join(result)

复杂度分析

时间复杂度:O(N),其中 N 是字符串 S 的长度。

空间复杂度:O(N),其中 N 是字符串 S 中不同字符的数量。

总结

这道题目看似简单,但它需要我们仔细分析字符串中相邻字符的关系。通过使用栈数据结构或哈希表,我们可以有效地解决这个问题。希望今天的解题过程能对你有所启发,让我们继续探索 LeetCode 的奇妙世界!