题目
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
分析采用双指针遍历,尾指针遍历至包含T的所有字符,首指针尽可能向后压缩,然后在所有窗口中记录最小窗口位置。
参考http://leetcode.com/2010/11/finding-minimum-window-in-s-which.html
代码
public class MinimumWindowSubstring {
public String minWindow(String S, String T) {
if (T == null || T.length() == 0 || S == null || S.length() == 0) {
return "";
}
int M = S.length();
int N = T.length();
char[] s = S.toCharArray();
char[] t = T.toCharArray();
// use as map
int[] needToFind = new int[256];
int[] hasFound = new int[256];
for (int i = 0; i < N; ++i) {
++needToFind[t[i]];
}
int count = 0;
int minWinSize = Integer.MAX_VALUE;
int left = 0;
int right = 0;
for (int begin = 0, end = 0; end < M; ++end) {
if (needToFind[s[end]] == 0) {
continue;
}
++hasFound[s[end]];
if (hasFound[s[end]] <= needToFind[s[end]]) {
++count;
}
if (count == N) {
while (needToFind[s[begin]] == 0
|| (hasFound[s[begin]] > needToFind[s[begin]])) {
if ((hasFound[s[begin]] > needToFind[s[begin]])) {
--hasFound[s[begin]];
}
++begin;
}
int winSize = end - begin + 1;
if (winSize < minWinSize) {
minWinSize = winSize;
left = begin;
right = end;
}
}
}
if (count == N) {
return S.substring(left, right + 1);
}
return "";
}
}