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

 1import java.util.Stack;
 2
 3/**
 4 * 1047. 删除字符串中的所有相邻重复项
 5 * 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
 6 * <p>
 7 * 在 S 上反复执行重复项删除操作,直到无法继续删除。
 8 * <p>
 9 * 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
10 * <p>
11 * <p>
12 * <p>
13 * 示例:
14 * <p>
15 * 输入:"abbaca"
16 * 输出:"ca"
17 * 解释:
18 * 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
19 * <p>
20 * <p>
21 * 提示:
22 * <p>
23 * 1 <= S.length <= 20000
24 * S 仅由小写英文字母组成。
25 */
26public class RemoveDuplicates {
27    /**
28     * 通过 栈对每一个元素匹配,
29     * <p>
30     * 简单来说 字符串与当前栈内字符进行匹配,如果相同就出栈当前元素,并且跳过当前元素,如果不匹配就入栈
31     *
32     * @param S
33     * @return
34     */
35    public static String removeDuplicates(String S) {
36        Stack<Character> stack = new Stack<>();
37        for (int i = 0; i < S.length(); i++) {
38            if (!stack.isEmpty() && stack.peek() == S.charAt(i)) {
39                stack.pop();
40                continue;
41            } else {
42                stack.push(S.charAt(i));
43            }
44        }
45
46        StringBuilder str = new StringBuilder();
47        for (Character c : stack) {
48            str.append(c);
49        }
50
51        return str.toString();
52    }
53
54    public static void main(String[] args) {
55        String s = "abbaca";
56        System.out.println(removeDuplicates(s));
57    }
58}
posted @   小傻孩丶儿  阅读(115)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示