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

import java.util.Stack;

class Solution {
    public String removeDuplicates(String s) {

        Stack<Character> stack = new Stack();

        for (int i = 0; i < s.length(); i++) {

            char c = s.charAt(i);

            /**
             * 如果栈为空或者栈顶元素不相同,就可以压入
             */
            if (stack.isEmpty() || stack.peek() != c){
                stack.push(c);
            }
            else {
                stack.pop();
            }
        }

        /**
         * 栈里的元素会逆序弹出,因此需要反转字符串
         */
        String str = "";

        while (!stack.isEmpty()){
            str = stack.pop() + str;
        }

        return str;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

双指针法

class Solution {
    public String removeDuplicates(String s) {

        char[] arr = s.toCharArray();

        /**
         * 双指针法
         * 总是让右指针元素覆盖左指针,每遇到重复元素,左指针就左移一位,让后面的右指针覆盖这个位置,这样每个重复的元素都会被覆盖
         * 如果不相同就一起移动
         */
        int left = 0;
        int right = 0;

        while (right < arr.length){

            arr[left] = arr[right];

            if (left >= 1 && arr[left] == arr[left - 1]){
                left--;
            }
            else {
                left++;
            }

            right++;
        }

        /**
         * 将部分数组转换为字符串
         */
        return new String(arr, 0, left);
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/

posted @   振袖秋枫问红叶  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示