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

1047. 删除字符串中的所有相邻重复项

知识点:栈

题目描述

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

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

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"

解法一:自带栈

这个题应该能够发现这就是LeetCode 20 有效的括号的翻版,是要用栈来解的,逐步消消乐;
可以直接使用自带的栈,但是别忘了最后要出栈的时候是要翻转一下的,因为顺序使反的。

class Solution { public String removeDuplicates(String s) { Stack<Character> stack = new Stack<>(); for(Character c : s.toCharArray()){ if(stack.isEmpty()) stack.push(c); else if(c == stack.peek()) stack.pop(); else stack.push(c); } StringBuilder sb = new StringBuilder(); while(!stack.isEmpty()){ sb.append(stack.pop()); } return sb.reverse().toString(); } }
  • python
class Solution: def removeDuplicates(self, s: str) -> str: stack = [] for item in s: if not len(stack): stack.append(item) elif item == stack[-1]: stack.pop() else: stack.append(item) return "".join(stack)

解法二:数组栈

使用数组来模拟一个栈,这样在最后的时候不用翻转数组;

class Solution { public String removeDuplicates(String s) { StringBuilder sb = new StringBuilder(); for(Character c : s.toCharArray()){ if(sb.length() == 0) sb.append(c); else if(sb.charAt(sb.length()-1) == c) sb.deleteCharAt(sb.length()-1); else sb.append(c); } return sb.toString(); } }

参考链接

删除字符中所有相邻重复项


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15063794.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(93)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】1047. 删除字符串中的所有相邻重复项』
点击右上角即可分享
微信分享提示