一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第22天,点击查看活动详情。
【刷题日记】316. 去除重复字母
本次刷题日记的第 42 篇,力扣题为:316. 去除重复字母 ,中等
一、题目描述:
乍一看这个题是什么感受,又是一个中等题,但是题目内容极少的一道题,我电脑一个屏就可以装下了字符间距怎么加宽,我们肯定可以解决
二、这道题考察了什么思想?你的思appetite路是什么?
来看这题给我们展示了哪些重要的信息电脑蓝屏呢?
- 题目给出的字符串中,只包含 26 个字母,且顺序是未知的
- 题目要求我们按照去除字符串中重复的字符,且要保数组去重方法证字典序是最小的,还要数组去重求我们这些字母的相对位置需要正确
看到这里,是不是觉得这个题要求好多呀,不过没有电脑怎么重装系统关系,我们就像满足客字符是什么户需求一样,分析好了可行性之后,apple再来满足需求
我们来看题目的要求,需要保证咱们的字母相对位置要是APP和题目给出的字符串相对位置要一样,那么我们其实就可以想到,应该是需要遍历题目给出的数组和链表的区别字符串的,这样做才是比较很简单复杂度怎么计算的的
那么对于去除重复的字符,这个也就更简单了数组去重方法,但是其实并不纯字符粹,因为我们去除的重复字母是需要有方法的,并不是随便就去掉了,因为,题目数组和链表的区别要求咱们保证字典序还要是最小的
那字符间距在哪里设置么这个需要如何思考数组呢?
第一要保证顺序,第二要去掉重复的字符,那劳动复杂度么我们是否可以使用栈来保证顺序性呢?电脑截图快捷键
如何保证字典序呢?字典序,我们是不是只需要保证 前一个字母大于后一个字母的时候,咱appetite们就要把前一个字母干掉?
咱们在遍历的过程中,保证好如上 3 点,劳动复杂度那么一直遍历到字符串结尾,我们就可以得到答案了
大体思路我们可以这样来保证:
- 使用一个 helpe电脑黑屏却开着机r 数组来存放 26 个字母中,每个字符现在还剩余的个数,当有字符入栈的时候电脑怎么录屏,这个 he数组词pler 数组对应的字符approve数量就减去 1 个
- 拿一个切片来模拟栈,遍历字符软件复杂度串的时候,字符型变量校验当前字符是否小于栈顶元素,若是,那么appreciate就去掉栈顶元素,并将当前字符间距在哪里设置元素入栈
- 拿一个hash表来记录,某个字母是否已经存在与栈中了
按照上述思路来进行编码的话,我们应该都能实现了吧
三、编码
根据上述逻辑和分析,我们就可以翻译成如字符串是什么意思下代码,
- 这里需要注意,对于已经存在与栈里面的字符,我们就会再去校验他是否比栈顶的元素小了,因为按照之前的逻辑和流程,这种就需要跳过了
- 另外对于校验到application当前的元环形复杂度素比栈顶的小的时候,如果校验到栈顶的元素已经只有这一个了,那么我们也是需要跳过的
func removeDuplicateLetters(s string) string {
// 定义一个数组,作为hash表,记录字符的剩余个数
help := [26]int{}
// 记录当前字符串中中每个字符的出现次数
for _, ch := range s {
help[ch-'a']++
}
// 用一个切片来模拟栈
stack := []byte{}
// 用于记录是否在栈中
inStack := [26]bool{}
for i := range s {
ch := s[i]
// 如果 ch 字符不在 栈中
if !inStack[ch-'a'] {
// 当前的栈切片是有值的,且当前的字符是小于栈顶字符的
for len(stack) > 0 && ch < stack[len(stack)-1] {
last := stack[len(stack)-1] - 'a'
if help[last] == 0 {
break
}
// 去掉栈顶的元素
stack = stack[:len(stack)-1]
// 设置该字符不在栈中
inStack[last] = false
}
stack = append(stack, ch)
inStack[ch-'a'] = true
}
help[ch-'a']--
}
return string(stack)
}
按照如上实现的话,相信电脑开不了机很容易就能看明白这个单调栈处理的方式吧,分析清楚了的话还是很简单的
四、总结:
就上述编码来看数组去重方法,这里的时间复杂度是多少呢,这个应该是非常明数组和链表的区别显的,因为我们只遍历了一次题目给出的字符串,所以时间复杂字符串逆序输出度是 O(n)
空间复杂度是 O(∣∣) ,这个的含义在这里实际上是appear 26 ,因为咱们的字母个数只有 26 个,咱们引入的额外的空间是 26 个 int
原题地址:316. 去除重复字母
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到电脑黑屏却开着机这里
技术字符间距加宽2磅是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,电脑安全模式下次见~