返回
用自己的方式解决 LeetCode 1047:擦除相邻重复项
Android
2023-11-13 21:44:18
大家好,欢迎来到我的刷题打卡栏目!今天,我们一起探索 LeetCode 1047:删除字符串中的所有相邻重复项。这道题目看似简单,却暗藏玄机,让我们一起深入探究。
任务简述
给定一个只包含小写字母的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并将其删除。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后,返回最终的字符串。答案保证唯一。
举个例子,对于 S = "abbaca",重复项删除操作会依次进行以下步骤:
- 删除 "bb",得到 "aaca"
- 删除 "aa",得到 "ca"
- 无法再删除,最终结果为 "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 的奇妙世界!