LeetCode上删除字符串中的所有相邻重复项,简单难度,记录下解题思路
题目就是要求删除相邻重复项,一直删除直到没有相邻的重复项为止
一开始很容易想到递归操作,每次发现有相邻重复项就先截取再去在形成的新字符串中重复调用递归,直到没有相邻重复项就返回结果
var removeDuplicates = function(S) {
// 如果是字符串就分割为数组来计算
if(typeof S === 'string') S = S.split('')
// 遍历数组
for(let i = 0;i<S.length-1;i++) {
// 如果出现相邻同元素
if(S[i] === S[i+1]) {
// 截取数组
S.splice(i,2)
// 递归调用
return removeDuplicates(S)
}
}
return S.join('')
};
不过这样时间消耗也多,因为要多次遍历字符串
第二种方法使用栈来保存遍历后的数组,每次一个新元素都要比较和前一个元素的关系,如果相同就删除栈内元素,如果不同就放入栈
以字符串abbaac
来举例
遍历整个字符串,S作为栈来保存元素
在前3次遍历中
第一次a直接放入栈
第二次b也直接放入栈
第三次b和栈的前一位元素相同,要将栈中最后一个元素移出
所以此时的栈为
第四次a,因为之前栈删除了只剩一位元素a,和这个元素相同,还是要移出栈元素
之后的遍历没有相同元素,所以传入的元素保留,最后栈元素为
[a,c]
,通过join()
返回字符串即可
var removeDuplicates = function(S) {
const s = [];
for (let i= 0;i<S.length;i++) {
if (s.length !== 0 && s[s.length - 1] === S[i]) {
s.pop();
} else {
s.push(S[i]);
}
}
return s.join('');
};
这样处理之后因为遍历次数减少,时间也减少了很多