力扣1047 删除字符串中的所有相邻重复项 Java版本

文章目录

  • 题目描述
  • 思路1 用栈来完成
  • 代码1
  • 思路2 双指针来完成
  • 代码2


题目描述

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

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

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

示例:

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

提示:

1 <= S.length <= 20000
S 仅由小写英文字母组成。

思路1 用栈来完成

使用栈来完成,遍历字符串,如果栈顶元素不同则压入栈中,相同就把栈顶元素弹出,类似于开心消消乐。

代码1

class Solution {
    public String removeDuplicates(String s) {
        //可以使用栈来完成,遍历字符串,如果与栈顶元素不同则压入栈中,相同就把栈顶元素弹出
        ArrayDeque<Character> deque = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            //如果栈空或者栈顶元素与ch不相同,就压入栈中
            if(deque.isEmpty()||deque.peek()!=ch){
                deque.push(ch);
            }else{
                deque.pop();
            }

        }
        String res="";
        while (!deque.isEmpty()){
            res = deque.pop()+res;
        }
        return res;
    }
}

思路2 双指针来完成

用双指针,相当于用不重复的值把前面重复的值给覆盖,并且覆盖之后还需要进一步判断是否与前面的值重复。

代码2

class Solution {
    public String removeDuplicates(String s) {
        //这个方法使用双指针,相当于用不重复的项覆盖掉前面重复的项
        //设置一个快指针,一个慢指针
        int fast=0;
        int slow=0;

        char[] chars = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
            //先让慢指针位置的值等于快指针
            chars[slow]=chars[fast];
            //然后让慢指针位置的值与前一个位置比较,如果相同就slow--这样后面的值就可以把这个位置的值给覆盖掉
            while (slow>0&&chars[slow]==chars[slow-1]){
                slow--;
            }
            //fast++,继续探索后面的值
            fast++;
        }
        //返回的时候只需要返回字符串0到slow位置就可以了
        String res = new String(chars,0,slow);
        return res;
    }
}

你可能感兴趣的:(LeetCode,java,leetcode,python)