40
40
41
41
<!-- 这里可写通用的实现逻辑 -->
42
42
43
- ** 方法一:单调栈**
43
+ ** 方法一:栈**
44
+
45
+ 我们用一个数组 ` last ` 记录每个字符最后一次出现的位置,用栈来保存结果字符串,用一个数组 ` vis ` 或者一个整型变量 ` mask ` 记录当前字符是否在栈中。
46
+
47
+ 遍历字符串 $s$,对于每个字符 $c$,如果 $c$ 不在栈中,我们就需要判断栈顶元素是否大于 $c$,如果大于 $c$,且栈顶元素在后面还会出现,我们就将栈顶元素弹出,将 $c$ 压入栈中。
48
+
49
+ 最后将栈中元素拼接成字符串作为结果返回。
50
+
51
+ 时间复杂度 $O(n)$。其中 $n$ 为字符串 $s$ 的长度。
44
52
45
53
<!-- tabs:start -->
46
54
47
55
### ** Python3**
48
56
49
57
<!-- 这里可写当前语言的特殊实现逻辑 -->
50
58
59
+ ``` python
60
+ class Solution :
61
+ def removeDuplicateLetters (self , s : str ) -> str :
62
+ last = defaultdict(int )
63
+ for i, c in enumerate (s):
64
+ last[c] = i
65
+ stk = []
66
+ vis = set ()
67
+ for i, c in enumerate (s):
68
+ if c in vis:
69
+ continue
70
+ while stk and stk[- 1 ] > c and last[stk[- 1 ]] > i:
71
+ vis.remove(stk.pop())
72
+ stk.append(c)
73
+ vis.add(c)
74
+ return ' ' .join(stk)
75
+ ```
76
+
51
77
``` python
52
78
class Solution :
53
79
def removeDuplicateLetters (self , s : str ) -> str :
@@ -70,10 +96,95 @@ class Solution:
70
96
return ' ' .join(stack)
71
97
```
72
98
73
- ### ** Go **
99
+ ### ** Java **
74
100
75
101
<!-- 这里可写当前语言的特殊实现逻辑 -->
76
102
103
+ ``` java
104
+ class Solution {
105
+ public String removeDuplicateLetters (String s ) {
106
+ int n = s. length();
107
+ int [] last = new int [26 ];
108
+ for (int i = 0 ; i < n; ++ i) {
109
+ last[s. charAt(i) - ' a' ] = i;
110
+ }
111
+ Deque<Character > stk = new ArrayDeque<> ();
112
+ int mask = 0 ;
113
+ for (int i = 0 ; i < n; ++ i) {
114
+ char c = s. charAt(i);
115
+ if (((mask >> (c - ' a' )) & 1 ) == 1 ) {
116
+ continue ;
117
+ }
118
+ while (! stk. isEmpty() && stk. peek() > c && last[stk. peek() - ' a' ] > i) {
119
+ mask ^ = 1 << (stk. pop() - ' a' );
120
+ }
121
+ stk. push(c);
122
+ mask |= 1 << (c - ' a' );
123
+ }
124
+ StringBuilder ans = new StringBuilder ();
125
+ for (char c : stk) {
126
+ ans. append(c);
127
+ }
128
+ return ans. reverse(). toString();
129
+ }
130
+ }
131
+ ```
132
+
133
+ ### ** C++**
134
+
135
+ ``` cpp
136
+ class Solution {
137
+ public:
138
+ string removeDuplicateLetters(string s) {
139
+ int n = s.size();
140
+ int last[ 26] = {0};
141
+ for (int i = 0; i < n; ++i) {
142
+ last[ s[ i] - 'a'] = i;
143
+ }
144
+ string ans;
145
+ int mask = 0;
146
+ for (int i = 0; i < n; ++i) {
147
+ char c = s[ i] ;
148
+ if ((mask >> (c - 'a')) & 1) {
149
+ continue;
150
+ }
151
+ while (!ans.empty() && ans.back() > c && last[ ans.back() - 'a'] > i) {
152
+ mask ^= 1 << (ans.back() - 'a');
153
+ ans.pop_back();
154
+ }
155
+ ans.push_back(c);
156
+ mask |= 1 << (c - 'a');
157
+ }
158
+ return ans;
159
+ }
160
+ };
161
+ ```
162
+
163
+ ### **Go**
164
+
165
+ ```go
166
+ func removeDuplicateLetters(s string) string {
167
+ last := make([]int, 26)
168
+ for i, c := range s {
169
+ last[c-'a'] = i
170
+ }
171
+ stk := []rune{}
172
+ vis := make([]bool, 128)
173
+ for i, c := range s {
174
+ if vis[c] {
175
+ continue
176
+ }
177
+ for len(stk) > 0 && stk[len(stk)-1] > c && last[stk[len(stk)-1]-'a'] > i {
178
+ vis[stk[len(stk)-1]] = false
179
+ stk = stk[:len(stk)-1]
180
+ }
181
+ stk = append(stk, c)
182
+ vis[c] = true
183
+ }
184
+ return string(stk)
185
+ }
186
+ ```
187
+
77
188
``` go
78
189
func removeDuplicateLetters (s string ) string {
79
190
count , in_stack , stack := make ([]int , 128 ), make ([]bool , 128 ), make ([]rune, 0 )
0 commit comments