leetcode1047.删除字符串中的所有相邻重复项

118 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言

最近在分类型的刷leetcode上的题,这周刷到栈与队列。今天刷到1047题删除字符串中的所有相邻重复项,感觉十分有记录下来的必要,题目不难但是代表了一个类型的问题。

题目描述

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

大概的意思就是相邻的两个重复的字母会被删除,但是删除后得到新的字符串相邻的还是要删除,一直到最后没有相邻的字符了。

思考

一开始当然想到的是暴力解决,可是暴力的方式时间复杂度和空间复杂度都十分的高了。正好我昨天做了一道题(20.有效的括号),这个题通过匹配括号,使用栈的方式。如果符合则弹出。仔细想一想这道题与那道题有非常多的相似之处,甚至还要简单一些。

解决

/**
 * @param {string} s
 * @return {string}
 */
var removeDuplicates = function(s) {
    const stack = []
    for(const x of s) {
        let c = 0
        if(stack.length && x === (c = stack.pop())) continue
        c && stack.push(c)
        stack.push(x)
    }
    return stack.join("")
};

注意

如果最后使用弹出栈中的元素的方式得到结果,需要注意栈后入先出的特性,需要将结果反转后返回。

总结

通过一段时间的刷题,感觉自己对数据结构的理解更加深刻了。从以前一看到题目只会想到暴力的解法,解一会解出来也不去管复杂度,解不出来就去看题解。到现在可以想一想更高效的解法,并进行总结。继续努力,学习更多的东西!