【算法11天:Day11】第五章栈和队列 LeetCode 删除字符串中的所有相邻重复项(1047)

71 阅读1分钟

题目四:

解法一:(栈)

解题思路:匹配问题都是栈的强项,首先我们需要遍历整个字符串,如果栈的长度小于1,也就是没有元素,则直接入栈,如果栈的长度大于1,则当前匹配的字符,需要与栈顶元素进行比较,如果相等,则栈顶元素出栈,否则,元素入栈,最后返回结果字符串就行。

var removeDuplicates = function(s) {
    const stack = []

    for (let i = 0; i < s.length; i++) {
        let c = null
        if(stack.length >= 1) {
            if (s[i] === (c = stack.pop())) {
                continue
            }
        }
        // 因为之前判断已经调用了pop方法,如果不符合,要重新压栈
        stack.push(c) 
        stack.push(s[i])
    }
    return stack.join('')
};
// 类似
var removeDuplicates = function(s) {
    const stack = [];
    for(const x of s) {
        let c = null;
        if(stack.length && x === (c = stack.pop())) continue;
        c && stack.push(c);
        stack.push(x);
    }
    return stack.join("");
};
// 或者
var removeDuplicates = function(s) {
    const stack = []

    for (let i = 0; i < s.length; i++) {
        if(stack.length >= 1) {
            if (s[i] === stack[stack.length - 1]) {
                stack.pop()
                continue
            }
        }
        stack.push(s[i])
    }
    return stack.join('')
};

解法二:(双指针模拟栈)

// 原地解法(双指针模拟栈)
var removeDuplicates = function(s) {
    s = [...s];
    let top = -1; // 指向栈顶元素的下标
    for(let i = 0; i < s.length; i++) {
        if(top === -1 || s[top] !== s[i]) { // top === -1 即空栈
            s[++top] = s[i]; // 入栈
        } else {
            top--; // 推出栈
        }
    }
    s.length = top + 1; // 栈顶元素下标 + 1 为栈的长度
    return s.join('');
};