持续创作,加速成长!这是我参与「掘金日新计划 · 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("")
};
注意
如果最后使用弹出栈中的元素的方式得到结果,需要注意栈后入先出的特性,需要将结果反转后返回。
总结
通过一段时间的刷题,感觉自己对数据结构的理解更加深刻了。从以前一看到题目只会想到暴力的解法,解一会解出来也不去管复杂度,解不出来就去看题解。到现在可以想一想更高效的解法,并进行总结。继续努力,学习更多的东西!