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%的用户