给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
---------------------------------------------------------------------------------------------
思路:当然是滑动窗口啦
t存在大小128的整形数组里(ascll表128)
int l=0,r=0,min=s.length()+1,start=0,count=0;
然后就是循环往右扩都满足后 左边界在往右扩找最小
最后返回截取的字符串就ok了
-----------------------------------------------
class Solution {
public String minWindow(String s, String t) {
if(s==null||t==null||s.length()<t.length()||s==""||t=="")return "";
int []need=new int[128];
int[]have=new int[128];
for(int i=0;i<t.length();i++){
need[t.charAt(i)]++;
}
int l=0,r=0,min=s.length()+1,start=0,count=0;
while(r<s.length()){
char rr=s.charAt(r);
if(need[rr]==0){
r++;
continue;
}
if(have[rr]<need[rr]){
count++;
}
have[rr]++;
r++;
while(count==t.length()){
if(r-l<min){
min=r-l;
start=l;
}
char ll=s.charAt(l);
if (need[ll] == 0) {
l++;
continue;
}
if(have[ll]==need[ll]){
count--;
}
have[ll]--;
l++;
}
}
if(min==s.length()+1){
return "";
}
return s.substring(start,start+min);
}
}