40
40
41
41
** 方法一:栈**
42
42
43
- 我们用一个数组 ` last ` 记录每个字符最后一次出现的位置 ,用栈来保存结果字符串,用一个数组 ` vis ` 或者一个整型变量 ` mask ` 记录当前字符是否在栈中。
43
+ 我们用一个数组 $ last$ 记录字符串 $s$ 每个字符最后一次出现的位置 ,用栈来保存结果字符串,用一个数组 $ vis$ 或者一个整型变量 $ mask$ 记录当前字符是否在栈中。
44
44
45
45
遍历字符串 $s$,对于每个字符 $c$,如果 $c$ 不在栈中,我们就需要判断栈顶元素是否大于 $c$,如果大于 $c$,且栈顶元素在后面还会出现,我们就将栈顶元素弹出,将 $c$ 压入栈中。
46
46
47
47
最后将栈中元素拼接成字符串作为结果返回。
48
48
49
- 时间复杂度 $O(n)$。其中 $n$ 为字符串 $s$ 的长度。
49
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$ 。其中 $n$ 是字符串 $s$ 的长度。
50
50
51
51
<!-- tabs:start -->
52
52
57
57
``` python
58
58
class Solution :
59
59
def smallestSubsequence (self , s : str ) -> str :
60
- last = defaultdict(int )
61
- for i, c in enumerate (s):
62
- last[c] = i
60
+ last = {c: i for i, c in enumerate (s)}
63
61
stk = []
64
62
vis = set ()
65
63
for i, c in enumerate (s):
@@ -69,30 +67,7 @@ class Solution:
69
67
vis.remove(stk.pop())
70
68
stk.append(c)
71
69
vis.add(c)
72
- return ' ' .join(stk)
73
- ```
74
-
75
- ``` python
76
- class Solution :
77
- def smallestSubsequence (self , s : str ) -> str :
78
- count, in_stack = [0 ] * 128 , [False ] * 128
79
- stack = []
80
- for c in s:
81
- count[ord (c)] += 1
82
-
83
- for c in s:
84
- count[ord (c)] -= 1
85
- if in_stack[ord (c)]:
86
- continue
87
- while len (stack) and stack[- 1 ] > c:
88
- peek = stack[- 1 ]
89
- if count[ord (peek)] < 1 :
90
- break
91
- in_stack[ord (peek)] = False
92
- stack.pop()
93
- stack.append(c)
94
- in_stack[ord (c)] = True
95
- return ' ' .join(stack)
70
+ return " " .join(stk)
96
71
```
97
72
98
73
### ** Java**
@@ -209,27 +184,33 @@ func smallestSubsequence(s string) string {
209
184
}
210
185
```
211
186
212
- ``` go
213
- func smallestSubsequence (s string ) string {
214
- count , in_stack , stack := make ([]int , 128 ), make ([]bool , 128 ), make ([]rune, 0 )
215
- for _ , c := range s {
216
- count[c] += 1
217
- }
187
+ ### ** TypeScript**
218
188
219
- for _ , c := range s {
220
- count[c] -= 1
221
- if in_stack[c] {
222
- continue
223
- }
224
- for len (stack) > 0 && stack[len (stack)-1 ] > c && count[stack[len (stack)-1 ]] > 0 {
225
- peek := stack[len (stack)-1 ]
226
- stack = stack[0 : len (stack)-1 ]
227
- in_stack[peek] = false
228
- }
229
- stack = append (stack, c)
230
- in_stack[c] = true
231
- }
232
- return string (stack)
189
+ ``` ts
190
+ function smallestSubsequence(s : string ): string {
191
+ const f = (c : string ): number => c .charCodeAt (0 ) - ' a' .charCodeAt (0 );
192
+ const last: number [] = new Array (26 ).fill (0 );
193
+ for (const [i, c] of [... s ].entries ()) {
194
+ last [f (c )] = i ;
195
+ }
196
+ const stk: string [] = [];
197
+ let mask = 0 ;
198
+ for (const [i, c] of [... s ].entries ()) {
199
+ const x = f (c );
200
+ if ((mask >> x ) & 1 ) {
201
+ continue ;
202
+ }
203
+ while (
204
+ stk .length &&
205
+ stk [stk .length - 1 ] > c &&
206
+ last [f (stk [stk .length - 1 ])] > i
207
+ ) {
208
+ mask ^= 1 << f (stk .pop ()! );
209
+ }
210
+ stk .push (c );
211
+ mask |= 1 << x ;
212
+ }
213
+ return stk .join (' ' );
233
214
}
234
215
```
235
216
0 commit comments