其他分享
首页 > 其他分享> > 1047. 删除字符串中的所有相邻重复项

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/

标签:arr,1047,String,复杂度,相邻,字符串,指针,stack,left
来源: https://www.cnblogs.com/taoyuann/p/15914038.html