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).
Example:
Input: S = "ADOBECODEBANC", T = "ABC" Output: "BANC"
Note:
- If there is no such window in S that covers all characters in T, return the empty string
""
. - If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
双指针,动态维护一个区间。尾指针不断往后扫,当扫到有一个窗口包含了所有 T 的字符后,然后再收缩头指针,直到不能再收缩为止。最后记录所有可能的情况中窗口最小的
class Solution {
public String minWindow(String s, String t) {
if (s.isEmpty()) {
return "";
}
if (s.length() < t.length()) {
return "";
}
final int ASCII = 256;
int[] expect_count = new int[ASCII];
int[] appear_count = new int[ASCII];
Arrays.fill(expect_count, 0);
Arrays.fill(appear_count, 0);
int appear = 0, wnd_start = 0, min_width = Integer.MAX_VALUE;
int min_start = 0;
for (int i = 0; i < t.length(); i++) {
expect_count[t.charAt(i)]++;
}
for (int wnd_end = 0; wnd_end < s.length(); wnd_end++) {
if (expect_count[s.charAt(wnd_end)] > 0) {
appear_count[s.charAt(wnd_end)]++;
if (appear_count[s.charAt(wnd_end)] <=
expect_count[s.charAt(wnd_end)]) {
appear++;
}
}
if (appear == t.length()) {
while (appear_count[s.charAt(wnd_start)] >
expect_count[s.charAt(wnd_start)] ||
expect_count[s.charAt(wnd_start)] == 0) {
appear_count[s.charAt(wnd_start)]--;
wnd_start++;
}
if (min_width > wnd_end - wnd_start + 1) {
min_width = wnd_end - wnd_start + 1;
min_start = wnd_start;
}
}
}
if (min_width == Integer.MAX_VALUE) {
return "";
} else {
return s.substring(min_start, min_start + min_width);
}
}
}