File tree 1 file changed +43
-29
lines changed
scripts/algorithms/M/Minimum Window Substring
1 file changed +43
-29
lines changed Original file line number Diff line number Diff line change 1
- class Solution :
2
- def minWindow (self , s : str , t : str ) -> str :
3
- tcounter = defaultdict (int )
4
- for c in t :
5
- tcounter [c ] += 1
6
-
7
- start = 0
8
- scounter = defaultdict (int )
9
- ml = ''
10
- win = False
11
- for i , c in enumerate (s ):
12
- scounter [c ] += 1
13
-
14
- if not win :
15
- win = True
16
- for k , v in tcounter .items ():
17
- if scounter [k ] < v :
18
- win = False
19
- break
20
-
21
- if win :
22
- while scounter [s [start ]] - 1 >= tcounter [s [start ]]:
23
- scounter [s [start ]] -= 1
24
- start += 1
25
-
26
- if not ml or i - start + 1 < len (ml ):
27
- ml = s [start :i + 1 ]
28
-
29
- return ml
1
+ # Added on 2022-08-18 15:51:55.963915
2
+
3
+ var minWindow = function (s , t ) {
4
+ const tf = {}, sf = {};
5
+ for (let c of t ) {
6
+ tf [c ] = (tf [c ] | | 0 ) + 1 ;
7
+ }
8
+ let l = 0 , r = 0 , rs = t .length ;
9
+ let ml = - 1 , mr = - 1 ;
10
+ for (; r < s .length ; r + + ) {
11
+ const c = s [r ];
12
+
13
+ if (!tf [c ]) continue ;
14
+
15
+ const sc = sf [c ] | | 0 ;
16
+ sf [c ] = sc + 1 ;
17
+ if (sf [c ] <= tf [c ]) {
18
+ rs - - ;
19
+ }
20
+
21
+ if (rs == 0 ) {
22
+ while (true ) {
23
+ if (mr == - 1 | | mr - ml > r - l ) {
24
+ [mr , ml ] = [r , l ];
25
+ }
26
+
27
+ const c = s [l ];
28
+ if (!tf [c ]) {
29
+ l + + ;
30
+ }
31
+ else if (sf [c ] - 1 < tf [c ]) {
32
+ sf [c ]- - , l + + , rs + + ;
33
+ break ;
34
+ } else {
35
+ sf [c ]- - ;
36
+ l + + ;
37
+ }
38
+ }
39
+ }
40
+ }
41
+ if (mr == - 1 ) return '' ;
42
+ return s .slice (ml , mr + 1 );
43
+ };
You can’t perform that action at this time.
0 commit comments