这种题都是hashmap加two pointers思想 但是移动start pointer的rules不一样 以及判断是否包含了所有的字母找到了答案的方法也不太一样
这个题也是先统计总共需要哪些字母 需要多少个 然后开始扫
同样是要找到有效count等于需要的总count之后表示找到了答案 然后这个题的start指针记得要挪动到下一个valid字母处
public class Solution {
public String minWindow(String s, String t) {
HashMap<Character, Integer> hist = new HashMap<Character, Integer>();
for ( int i = 0; i < t.length(); i ++ ){
if ( hist.containsKey ( t.charAt( i )))
hist.put ( t.charAt( i ), hist.get (t.charAt(i)) + 1);
else
hist.put ( t.charAt( i ), 1 );
}
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int start = 0;
String minSub = "";
int minLen = Integer.MAX_VALUE;
int count = 0;
for ( int i = 0; i < s.length(); i ++ ){
char c = s.charAt ( i );
if ( hist.containsKey ( c ) ){
if ( map.containsKey( c ) )
map.put ( c, map.get ( c ) + 1 );
else
map.put ( c, 1 );
if ( map.get ( c ) <= hist.get ( c ))
count ++;
}
if ( count == t.length()){
while( !hist.containsKey(s.charAt(start)) || map.get(s.charAt(start)) > hist.get(s.charAt(start))){
if( map.containsKey(s.charAt(start)))
map.put(s.charAt(start), map.get(s.charAt(start))-1);
start++;
}
if ( i - start + 1 < minLen ){
minLen = i - start + 1;
minSub = s.substring( start, i + 1 );
}
count --;
map.put(s.charAt(start), map.get(s.charAt(start))-1);
start ++;
}
}
return minSub;
}
}