[专题3:栈和队列]1047.删除字符串中的所有相邻重复项

题目描述:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。

输入样例:

  • 输入:"abbaca"
  • 输出:"ca"

解题思路:

方法一:栈

将字符压入栈中,如果栈顶元素等于当前元素,栈顶元素出栈。

def removeDuplicates(s):
    stack = list()
    for i in range(len(s)):
        if len(stack) == 0 or stack[-1] != s[i]:
            stack.append(s[i])
        else:
            stack.pop()
    return ''.join(stack)

方法二:两个指针,初始化 slow和fast指向索引0,如果slow和slow-1元素相等,slow指针减一,覆盖掉相等的元素;如果不相等,fast和slow同时加1。

def removeDuplicates(s):
    res = list(s)
    slow = fast = 0
    length = len(res)

    while fast < length:
        # 如果一样直接换,不一样会把后面的填在slow的位置
        res[slow] = res[fast]
            
        # 如果发现和前一个一样,就退一格指针
        if slow > 0 and res[slow] == res[slow - 1]:
            slow -= 1
        else:
            slow += 1
        fast += 1
            
    return ''.join(res[0: slow])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值