316. 去除重复字母
去除重复字母
题目描述:
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = “bcabc”
输出:”abc”
示例 2:
输入:s = “cbacdcbc”
输出:”acdb”
提示:
1 <= s.length <= 104
s 由小写英文字母组成
思路:
时间复杂度:O(n),空间复杂度O(n)
使用单调栈的方式来做,想要在单调栈内部是升序的
代码:
func removeDuplicateLetters(s string) string {
left := [26]int{}
var stack []byte
var isInRes [26]bool
for i := range s{
left[s[i]-'a']++
}
for i := range s{
ch := s[i]
if !isInRes[ch-'a']{
for len(stack)>0 && ch < stack[len(stack)-1]{
last := stack[len(stack)-1]-'a'
if left[last] == 0{
break
}
isInRes[last] = false
stack = stack[:len(stack)-1]
}
isInRes[ch-'a'] = true
stack = append(stack, ch)
}
left[ch-'a']--
}
return string(stack)
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:1.9 MB, 在所有 Go 提交中击败了99.07%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!