-
Notifications
You must be signed in to change notification settings - Fork 0
/
316.去除重复字母.go
55 lines (46 loc) · 948 Bytes
/
316.去除重复字母.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package leetcode
/*
* @lc app=leetcode.cn id=316 lang=golang
*
* [316] 去除重复字母
*/
// @lc code=start
import (
"strings"
)
func removeDuplicateLetters(s string) string {
flag := [26]int{}
// 统计所有字母出现的次数
for _, char := range s {
flag[int(char - 'a')]++
}
// 开始用单调栈的思路
monoStack := make([]int, 26)
stackTop := -1
isInStack := [26]bool{}
for _, char := range s {
intChar := int(char - 'a')
if isInStack[intChar] {
flag[intChar]--
continue
}
for stackTop >= 0 {
if monoStack[stackTop] >= intChar && flag[monoStack[stackTop]] > 0 {
isInStack[monoStack[stackTop]] = false
stackTop--
continue
}
break
}
stackTop++
monoStack[stackTop] = intChar
flag[intChar]--
isInStack[intChar] = true
}
buf := strings.Builder{}
for i := 0; i <= stackTop; i++ {
buf.WriteRune(rune(monoStack[i] + 'a'))
}
return buf.String()
}
// @lc code=end