316.去除重复字母

131 阅读1分钟

题目:
给你一个字符串 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)
}