class Solution {
public String minWindow(String s, String t) {
HashMap<Character, Integer> need = new HashMap<Character, Integer>();
HashMap<Character, Integer> window = new HashMap<Character, Integer>();
for(char c : t.toCharArray()) {
if(need.containsKey(c)) {
need.put(c, need.get(c) + 1);
} else {
need.put(c, 1);
}
}
int left = 0;
int right = 0;
int valid = 0;
// 最小覆盖子串的开始索引
int start = 0;
// 最小覆盖子串的长度
int len = Integer.MAX_VALUE;
while (right < s.length()) {
// 将移入窗口的字符
char c = s.charAt(right);
// 右移窗口
right++;
// 更新窗口内数据
if (need.containsKey(c)) {
if(window.containsKey(c)) {
window.put(c, window.get(c) + 1);
} else {
window.put(c, 1);
}
if(window.get(c).equals(need.get(c))) {
valid++;
}
}
// 收缩窗口
while (valid == need.size()) {
// 更新最小覆盖子串
if (right - left < len) {
start = left;
len = right -left;
}
// 将移出窗口的字符
char b = s.charAt(left);
// 左移窗口
left++;
// 更新窗口内数据
if (need.containsKey(b)) {
if (window.get(b).equals(need.get(b))) {
valid--;
}
window.put(b, window.get(b) - 1);
}
}
}
if (len == Integer.MAX_VALUE) {
return "";
} else {
return s.substring(start, start + len);
}
}
}
注意:包装类和基本类型的值比较,== 对于包装类比较的是引用地址,包装类进行值比较应该用 equals 方法