2021/03/09 每日一题 删除字符串中的所有相邻重复项(两种方法)

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('');
};

这样处理之后因为遍历次数减少,时间也减少了很多


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容