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

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1047. 删除字符串中的所有相邻重复项相关的知识,希望对你有一定的参考价值。

截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666

在这里插入图片描述
在这里插入图片描述
视频链接

public String removeDuplicates(String S) {
    char[] chars = S.toCharArray();
    Stack<Character> stack = new Stack<>();
    int index = 0;
    int length = S.length();
    while (index < length) {
        char current = chars[index++];
        if (!stack.empty() && stack.peek() == current) {
            //如果栈顶的值和当前遍历的值相同,他两直接消失
            stack.pop();
        } else {
            //如果栈为空,或者栈顶元素和当前值不相同,就把当前值压入栈
            stack.push(current);
        }
    }
    //下面是把栈中的元素转化为字符串
    StringBuilder stringBuilder = new StringBuilder(stack.size());
    while (!stack.empty())
        stringBuilder.append(stack.pop());
    return stringBuilder.reverse().toString();
}

在这里插入图片描述

视频链接

public String removeDuplicates(String S) {
    int left = 0;
    int right = 0;
    int length = S.length();
    char[] chars = S.toCharArray();
    while (right < length) {
        //先把右边的字符赋值给左边
        chars[left] = chars[right];
        //然后判断左边挨着的两个字符是否相同,如果相同,
        //他两同时消失,也就是left往回退两步
        if (left > 0 && chars[left - 1] == chars[left])
            left -= 2;
        ++right;
        ++left;
    }
    return new String(chars, 0, left);
}

还可以使用StringBuilder,原理都是一样的,来看下代码

public String removeDuplicates(String S) {
    StringBuilder stringBuilder = new StringBuilder();
    char[] chars = S.toCharArray();
    for (char ch : chars) {
        int size = stringBuilder.length();
        if (size > 0 && stringBuilder.charAt(size - 1) == ch) {
            stringBuilder.deleteCharAt(size - 1);
        } else {
            stringBuilder.append(ch);
        }
    }
    return stringBuilder.toString();
}

总结

这题使用栈是最容易想到的,每次只需要比较要入栈的值和栈顶元素即可,如果一样,就同时消失。当然还可以使用双端队列,他是两头都可以添加和删除的一种数据结构,具体可以看下《359,数据结构-3,队列》

以上是关于LeetCode 1047. 删除字符串中的所有相邻重复项的主要内容,如果未能解决你的问题,请参考以下文章

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

Leetcode栈与队列1047. 删除字符串中的所有相邻重复项(一些题外话和做题经验!!看作对对碰游戏!!)

leetcode - 1047删除字符串所有重复字符 - Easy

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

Leetcode Practice --- 栈和队列

力扣算法JS LC [20. 有效的括号] LC [1047. 删除字符串中的所有相邻重复项]