题目描述
给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 s 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
思路与算法
只关注相邻的字符,我们可以使用栈来实现这个操作
- 如果当前字符与栈顶元素相同,则表示这两个字符是相邻的重复字符,可以删除它们。删除操作即为从栈中弹出栈顶元素。
- 如果当前字符与栈顶元素不同,则将当前字符压入栈中。
- 通过这种方式,所有重复的字符对都会被删除,最终栈中留下的就是最终的结果
代码
class Solution:
def removeDuplicates(self, s: str) -> str:
# 初始化一个空栈
stack = []
# 遍历字符串 s 中的每个字符
for char in s:
if stack and stack[-1] == char:
stack.pop() # pop() 函数用于移除列表中的一个元素(默认最后一个元素) list.pop([index=-1])
else:
# 如果栈为空,或者栈顶元素与当前字符不同,将当前字符压入栈中。
stack.append(char)
return ''.join(stack)
总结
- 入栈:使用 stack.append(char) 将字符压入栈中。
- 出栈:使用 stack.pop() 移除栈顶的元素。
- 使用 ‘’.join(stack) 将栈中的字符合并成最终的字符串。
- 问题特性:
反复操作:每次删除相邻的重复字符,必须在完成删除后继续检查。
局部性操作:每次检查的是“最近添加”的字符,符合 后进先出(LIFO)模式。
栈的优势: - 栈的优势
后进先出:栈自然支持检查和删除“最近添加”的元素,适合逐个字符匹配和删除相邻重复字符。
高效操作:栈的 push() 和 pop() 操作可以在常数时间内完成,避免复杂的字符移动或指针操作。
简单实现:栈的操作简洁高效,符合题目需求。