给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
滑动窗口解答:
以下为在力扣看的大佬的题解,记录学习
java代码:
class Solution {
public String minWindow(String s, String t) {
//创建数组用来表示目标所需字符的个数ascii范围
int[] need=new int[128];
for(int i=0;i<t.length();i++){
//添加目标字符所需个数到need
need[t.charAt(i)]+=1;
}
int l=0,needCount=t.length(),size=Integer.MAX_VALUE,start=0;
for(int r=0;r<s.length();r++){
char c=s.charAt(r);
//遍历到目标字符
if(need[c]>0){
needCount--;
}
//将遍历到的字符对应need数值-1
need[c]--;
//集齐了所有所需字符,开始缩小窗口
if(needCount==0){
while(need[s.charAt(l)]<0){//说明l处字符是无用的
need[s.charAt(l)]++;
l++;//左边界后移
}
//更新窗口大小以及窗口起始位置
if(r-l+1 < size){
size=r-l+1;
start=l;//方便返回字符串结果
}
//上面统计好size之后,开始找下一个包含所有的size,l处字符复位为所需字符1个
need[s.charAt(l)]++; //将l处字符重新计数加1
l++;
needCount++;
}
}
return size==Integer.MAX_VALUE ? "" :s.substring(start,start+size);
}
}