【LeetCode1047】删除字符串中的所有相邻重复项

题目描述

给出由小写字母组成的字符串 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)

总结

  1. 入栈:使用 stack.append(char) 将字符压入栈中。
  2. 出栈:使用 stack.pop() 移除栈顶的元素。
  3. 使用 ‘’.join(stack) 将栈中的字符合并成最终的字符串。
  4. 问题特性:
    反复操作:每次删除相邻的重复字符,必须在完成删除后继续检查。
    局部性操作:每次检查的是“最近添加”的字符,符合 后进先出(LIFO)模式。
    栈的优势:
  5. 栈的优势
    后进先出:栈自然支持检查和删除“最近添加”的元素,适合逐个字符匹配和删除相邻重复字符。
    高效操作:栈的 push() 和 pop() 操作可以在常数时间内完成,避免复杂的字符移动或指针操作。
    简单实现:栈的操作简洁高效,符合题目需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值