题目:
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
算法:
func removeDuplicateLetters(s string) string {
// 字符在stack中是否已经存在
inStack := make([]bool, 26)
// 没遍历的s中,剩下的字符个数
left := make([]byte, 26)
for i := range s {
left[s[i]-'a']++
}
stack := make([]byte, 0)
for i := range s {
if !inStack[s[i]-'a'] {
for len(stack) > 0 && stack[len(stack)-1] > s[i] {
// 尽管stack的末尾元素大于s[i],但s中已经不存在末尾元素了
if left[stack[len(stack)-1]-'a'] == 0 {
break
}
// s中还剩下末尾元素,末尾元素出栈
inStack[stack[len(stack)-1]-'a'] = false
stack = stack[:len(stack)-1]
}
stack = append(stack, s[i])
inStack[s[i]-'a'] = true
}
left[s[i]-'a']--
}
return string(stack)
}