思路:模拟挖坑填坑
Your runtime beats 97.00 % of java submissions.
class Solution {
//76. Minimum Window Substring*,包含t中所有字符的最短子串。假设输入范围为ascii
public String minWindow(String s, String t) {
if(s.length()<t.length()){
return "";
}
//1.设frequence[i]=k,若k<0,则该字符还缺abs(k)个;若k==0,刚好够填坑,不多不少;若k>0,多了K个。key. most important
int[] frequence=new int[256];
for(int i=0;i<t.length();i++){
frequence[t.charAt(i)]--;
}
//2.用双指针维护当前区间
int lack=t.length();
int i=0,j=0;
int start=-1,minLength=Integer.MAX_VALUE;
while(i<s.length()){
char ch;
while(j<s.length() && lack>0){//j不断向后探,直至越界或者能够找到涵盖t的子串
ch=s.charAt(j);
if(frequence[ch]<0){
lack--;
}
frequence[ch]++;
j++;
}
if(lack!=0){//到s的最后也没能找到,说明找不到了,退出
break;
}
//不断压缩左边
while(frequence[s.charAt(i)]>0){//i位置的字符仍有多有,可以丢掉
frequence[s.charAt(i)]--;
i++;
}
if(j-i<minLength){
minLength=j-i;
start=i;
}
//notice .key
frequence[s.charAt(i)]--;
i++;
lack=1;
}
if(start==-1){
return "";
}else{
return s.substring(start, start+minLength);
}
}
}