classSolution { public String minWindow(String s, String t) { if (s == null || t == null || s.length() == 0 || t.length() == 0 || s.length() < t.length()) return""; Map<Character, Integer> charCount = newHashMap<>(); for (inti=0; i < t.length(); i++) { charCount.put(t.charAt(i), charCount.getOrDefault(t.charAt(i), 0) + 1); } intleft=0, right = 0, count = 0, minLeft = 0, minRight = 0, min = Integer.MAX_VALUE;
while (right < s.length()) { // Move right pointer. while (right < s.length()) { if (charCount.containsKey(s.charAt(right))) { charCount.put(s.charAt(right), charCount.get(s.charAt(right)) - 1); if (charCount.get(s.charAt(right)) >= 0) { count += 1; } } if (count == t.length()) break; right += 1; }
// Test if out of bound. if (right == s.length()) break;
// Move left pointer until not all chars in t are included in the window. // left <= right可要可不要. while (count == t.length() && left <= right) { if (charCount.containsKey(s.charAt(left))) { charCount.put(s.charAt(left), charCount.get(s.charAt(left)) + 1); if (charCount.get(s.charAt(left)) > 0) { count -= 1; } } left += 1; }
// Check the length. if (right - (left - 1) + 1 < min) { minLeft = left - 1; minRight = right + 1; min = right - (left - 1) + 1; }
right += 1; } return min != Integer.MAX_VALUE ? s.substring(minLeft, minRight) : ""; } }