滑动窗口最经典的题目
主要要思考4个问题
- 当移动right时,也就是加入字符,需要更新哪些数据
- 什么条件下,窗口应该暂停扩大,开始移动left窗口
- 当移动left缩小窗口时,应该更新哪些数据
- 我们要的结果是在扩大窗口时还是缩小窗口时进行更新
2与4其实是对称的,
public String minWindow(String s, String t) {Map<Character, Integer> needs = new HashMap<>();Map<Character, Integer> windows = new HashMap<>();int left = 0;int right = 0;int valid = 0;int start = 0;int len = Integer.MAX_VALUE;char[] tC = t.toCharArray();char[] sC = s.toCharArray();for (char c : tC) {needs.put(c, needs.getOrDefault(c, 0) + 1);}while (right < s.length()) {char c = sC[right];right++;if (needs.containsKey(c)) {windows.put(c, windows.getOrDefault(c, 0) + 1);if (windows.getOrDefault(c, 0).equals(needs.get(c))) {valid++;}}while (valid == needs.size()) {if (right - left < len) {start = left;len = right - left;}char d = sC[left];left++;if (needs.containsKey(d)) {if (windows.getOrDefault(d, 0).equals(needs.get(d))) {valid--;}windows.put(d, windows.getOrDefault(d, 1) - 1);}}}return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);}
