解法一:(滑动窗口)在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。
class Solution {
Map<Character, Integer> map_s = new HashMap<>();
Map<Character, Integer> map_t = new HashMap<>();
public String minWindow(String s, String t) {
for(int i=0;i<t.length();i++){
map_t.put(t.charAt(i), map_t.getOrDefault(t.charAt(i),0)+1);
}
int left=0, right=-1;
int min_len=Integer.MAX_VALUE, left_len=-1, right_len=-1;
while(right<s.length()){
right++;
if(right<s.length() && map_t.containsKey(s.charAt(right))){
map_s.put(s.charAt(right), map_s.getOrDefault(s.charAt(right),0)+1);
}
while(check() && left<=right){
if(min_len > (right-left+1)){
min_len = right-left+1;
left_len = left;
right_len = right+1;
}
if(map_t.containsKey(s.charAt(left))){
map_s.put(s.charAt(left), map_s.getOrDefault(s.charAt(left),0)-1);
}
left++;
}
}
return left_len==-1 ? "" : s.substring(left_len,right_len);
}
public boolean check(){
Iterator iter = map_t.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry) iter.next();
Character key = (Character) entry.getKey();
Integer value = (Integer) entry.getValue();
if(map_s.getOrDefault(key,0) < value){
return false;
}
}
return true;
}
}
注意:
- 对于
char
类型,其对应的包装类是Character
- 判断某一key值是否存在:
map_s.containsKey()
,而不是map_s.isContainsKey()
map_t.getOrDefault(a,0)
:若a在map_t内,则返回key=a的value,否则返回0(默认值)。- 迭代:
Iterator iter = map_t.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry) iter.next();
Character key = (Character) entry.getKey();
Integer value = (Integer) entry.getValue();
}