1
+ /*
2
+
3
+ Date: Dec 25, 2014
4
+ Problem: Minimum Window Substring
5
+ Difficulty: Medium
6
+ Source: https://oj.leetcode.com/problems/minimum-window-substring/
7
+ Notes:
8
+ Given a string S and a string T, find the minimum window in S which will contain all the
9
+ characters in T in complexity O(n).
10
+ For example,
11
+ S = "ADOBECODEBANC"
12
+ T = "ABC"
13
+ Minimum window is "BANC".
14
+ Note:
15
+ If there is no such window in S that covers all characters in T, return the empty string "".
16
+ If there are multiple such windows, you are guaranteed that there will always be only one unique
17
+ minimum window in S.
18
+
19
+ Solution: 1. Use two pointers: start and end.
20
+ First, move 'end'. After finding all the needed characters, move 'start'.
21
+ 2. Use array as hashtable.
22
+ */
23
+
24
+ public class Solution {
25
+ public String minWindow (String S , String T ) {
26
+ int N = S .length (), M = T .length ();
27
+ if (N < M ) return new String ("" );
28
+ int [] need = new int [256 ];
29
+ int [] find = new int [256 ];
30
+ for (int i = 0 ; i < M ; ++i )
31
+ need [T .charAt (i )]++;
32
+
33
+ int count = 0 , resStart = -1 , resEnd = N ;
34
+ for (int start = 0 , end = 0 ; end < N ; ++end )
35
+ {
36
+ if (need [S .charAt (end )] == 0 )
37
+ continue ;
38
+ if (find [S .charAt (end )] < need [S .charAt (end )])
39
+ count ++;
40
+ find [S .charAt (end )]++;
41
+ if (count != M ) continue ;
42
+ // move 'start'
43
+ for (; start < end ; ++start ) {
44
+ if (need [S .charAt (start )] == 0 ) continue ;
45
+ if (find [S .charAt (start )] <= need [S .charAt (start )]) break ;
46
+ find [S .charAt (start )]--;
47
+ }
48
+ // update result
49
+ if (end - start < resEnd - resStart ) {
50
+ resStart = start ;
51
+ resEnd = end ;
52
+ }
53
+ }
54
+ return (resStart == -1 ) ? new String ("" ) : S .substring (resStart , resEnd + 1 );
55
+ }
56
+ }
0 commit comments