1、题目
2、分析
使用滑动窗口的算法框架。这道题还要注意下java处理字符串的常见的方法。
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
// c 是将移入窗口的字符
char c = s[right];
// 右移窗口
right++;
// 进行窗口内数据的一系列更新
...
/*** debug 输出的位置 ***/
printf("window: [%d, %d)\n", left, right);
/********************/
// 判断左侧窗口是否要收缩
while (window needs shrink) {
// d 是将移出窗口的字符
char d = s[left];
// 左移窗口
left++;
// 进行窗口内数据的一系列更新
...
}
}
}
3、代码
class Solution {
public String minWindow(String s, String t) {
HashMap<Character, Integer> need = new HashMap<>();
HashMap<Character, Integer> window = new HashMap<>();
int isValible = 0;
int left = 0, rigth = 0;
int start = 0, len = Integer.MAX_VALUE;
for(int i = 0; i < t.length(); i++){
need.put(t.charAt(i), need.getOrDefault(t.charAt(i), 0) + 1);
}
while(rigth < s.length()){
char c = s.charAt(rigth);
rigth++;
if(need.containsKey(c)){
window.put(c, window.getOrDefault(c, 0) + 1);
//注意用equals,不要用 ==
if(window.get(c).equals(need.get(c))){
isValible++;
}
}
while(isValible == need.size()){
if(rigth - left < len){
start = left;
len = rigth - left;
}
char d = s.charAt(left);
left++;
if(need.containsKey(d)){
//主要要用equals
if(window.get(d).equals(need.get(d))){
isValible--;
}
window.put(d, window.getOrDefault(d, 0) - 1);
}
}
}
return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
}
}