题目:
代码:
public String minWindow(String s, String t) {
// 两个map, 一个存放target的字符和数量, 另一个存放s字符出现在t中的字符和数量
HashMap<Character, Integer> need = new HashMap<>();
HashMap<Character, Integer> windows = new HashMap<>();
// 初始化need
for (char c : t.toCharArray()) {
need.put(c, need.getOrDefault(c, 0) + 1);
}
// start窗口左侧, end窗口右侧, count计数是否全部匹配, result保存结果
int start = 0, end = 0, count = 0;
String result = "";
while (end < s.length()){
char c = s.charAt(end);
end++;
// 如果need中含有c,那么windows中需要做处理
if (need.containsKey(c)){
windows.put(c, windows.getOrDefault(c, 0) + 1);
if (need.get(c).equals(windows.get(c))) count++;
}
// 如果数量已经达到need.size要求,进行处理
if (count == need.size()){
// 窗口左侧缩减 || 或者窗口右侧含有与窗口左侧相同的字符,需要更新
// 例如: s:DADBCA t:ABC
// 第一次匹配结果result=ADBC,但是这是一个次优结果,后面的BCA显然是最好的结果
// 此时start = 1, end = 5,进行下一轮循环,那么windows的A的数量就增加为2。需要对这个A的valuse-1才行。
while (!windows.containsKey(s.charAt(start)) || windows.get(s.charAt(start)) > need.get(s.charAt(start))){
if (need.containsKey(s.charAt(start))){
windows.put(s.charAt(start), windows.get(s.charAt(start)) - 1);
}
start++;
}
if (result.equals("") || result.length() > s.substring(start, end).length()){
result = s.substring(start, end);
}
}
}
return result;
}