class Solution {
public String minWindow(String s, String t) {
Map<Character, Integer> target = new HashMap<>();
for (int i = 0; i < t.length(); i++) {
target.put(t.charAt(i), target.getOrDefault(t.charAt(i), 0) + 1);
}
char[] input = s.toCharArray();
int l = 0;
int minLen = Integer.MAX_VALUE;
int ansStart = 0, ansEnd = 0;
int needed = target.size();
Map<Character, Integer> window = new HashMap<>();
for (int r = 0; r < input.length; r++) {
window.put(input[r], window.getOrDefault(input[r], 0) + 1);
Integer count = target.get(input[r]);
if (count != null && count.equals(window.get(input[r]))) {
needed--;
}
while (needed == 0) {
int curCnt = window.get(input[l]);
if (curCnt == 1) {
window.remove(input[l]);
} else {
window.put(input[l], curCnt - 1);
}
if (target.containsKey(input[l])) {
if (target.get(input[l]) == curCnt) {
needed++;
}
}
int len = r - l + 1;
if (needed == 1 && len < minLen) {
minLen = len;
ansStart = l;
ansEnd = r;
}
l++;
}
}
if (minLen == Integer.MAX_VALUE) {
return "";
}
return s.substring(ansStart, ansEnd + 1);
}
}
这道题跟395一样,缩小window都反而会破坏条件,但是这道题为什么可以主动缩小window呢,因为这里求的是min len,由此可以总结出sliding window的两个适用问题: