15
15
16
16
public class MinimumWindowSubstring {
17
17
public String minWindow (String S , String T ) {
18
- int sLen = S .length ();
19
- int tLen = T .length ();
20
- int [] needToFind = new int [256 ];
21
-
22
- for (int i = 0 ; i < tLen ; i ++)
23
- needToFind [T .charAt (i )]++;
24
-
25
18
int [] hasFound = new int [256 ];
26
- int minWindowLen = Integer .MAX_VALUE ;
27
- int minWindowBegin = 0 ;
28
- int minWindowEnd = 0 ;
29
- int count = 0 ;
30
- for (int begin = 0 , end = 0 ; end < sLen ; end ++) {
31
- // skip characters not in T
32
- if (needToFind [S .charAt (end )] == 0 )
33
- continue ;
34
- hasFound [S .charAt (end )]++;
35
- if (hasFound [S .charAt (end )] <= needToFind [S .charAt (end )])
36
- count ++;
37
-
38
- // if window constraint is satisfied
39
- if (count == tLen ) {
40
- // advance begin index as far right as possible,
41
- // stop when advancing breaks window constraint.
42
- while (needToFind [S .charAt (begin )] == 0
43
- || hasFound [S .charAt (begin )] > needToFind [S
44
- .charAt (begin )]) {
45
- if (hasFound [S .charAt (begin )] > needToFind [S .charAt (begin )])
46
- hasFound [S .charAt (begin )]--;
47
- begin ++;
19
+ int [] needFound = new int [256 ];
20
+ int diffCount = T .length ();
21
+ int length = S .length ();
22
+ String window = "" ;
23
+ int size = Integer .MAX_VALUE ;
24
+ if (length == 0 || diffCount == 0 )
25
+ return window ;
26
+ for (int l = 0 ; l < diffCount ; l ++) {
27
+ needFound [T .charAt (l )]++;
28
+ }
29
+ int i = 0 , j = 0 ;
30
+ while (j < length ) {
31
+ char c = S .charAt (j );
32
+ if (needFound [c ] > 0 && ++hasFound [c ] <= needFound [c ]) {
33
+ diffCount --;
34
+ }
35
+ if (diffCount == 0 ) {
36
+ while (i <= j ) {
37
+ char h = S .charAt (i );
38
+ i ++;
39
+ if (needFound [h ] > 0 && --hasFound [h ] < needFound [h ]) {
40
+ if (j - i + 1 < size ) {
41
+ size = j - i + 1 ;
42
+ window = S .substring (i - 1 , j + 1 );
43
+ }
44
+ diffCount ++;
45
+ break ;
46
+ }
48
47
}
49
-
50
- // update minWindow if a minimum length is met
51
- int windowLen = end - begin + 1 ;
52
- if (windowLen < minWindowLen ) {
53
- minWindowBegin = begin ;
54
- minWindowEnd = end ;
55
- minWindowLen = windowLen ;
56
- } // end if
57
- } // end if
58
- } // end for
59
-
60
- return (count == tLen ) ? S .substring (minWindowBegin , minWindowEnd + 1 )
61
- : "" ;
48
+ }
49
+ j ++;
50
+ }
51
+ return window ;
62
52
}
63
53
}
0 commit comments