题目四:
解法一:(栈)
解题思路:匹配问题都是栈的强项,首先我们需要遍历整个字符串,如果栈的长度小于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('');
};