通过遍历字符串 t,
整理t中出现的字符(key)和次数(value),保存在map中,然后遍历字符串s
var minWindow = function(s, t) {
let r=l=0
let len = s.length;
let subStart = len + 1; //最符合的子串的起点
let minLength = len + 1; //长度最小值
let missType = 0;//t中存在的字符类型
let map = new Map();//用来存储t中字符,以及缺失度
//整理t出现的字符(key)和次数(value)
for(let i=0;i<t.length;i++){
let a=map.get(t[i]) ||0
map.set(t[i],a+1)
}
missType=map.size //map.size是t的种类
for(r; r < len; r++){ //遍历字符串s
if(map.has(s[r])){ //统计当前字符出现的次数
let value = map.get(s[r]) - 1; //出现过,则减1
map.set(s[r], value); //保存更改过后的次数
}
if(map.get(s[r]) === 0){ //当满足出现次数,则完成一个种类
missType--; //t的种类-1
}
while(missType === 0){ //找到满足要求的种类和出现次数
//计算当前窗口长度
let length = r-l + 1;
//找到最小的长度
minlength=Math.min(length,r-l+1)
//记录当前左指针位置
subStart = l;
//左指针右移,处理左指针。
if(map.has(s[l])){ //l对应的字符在t中出现过,指针右移,所以当前字符将移除窗口
let value = map.get(s[l]) + 1;//则需求加1
map.set(s[l], value);
}
if(map.get(s[l]) > 0){ //当前要被移除的字符value大于0,说明在当前窗口内出现次数不足
missType++;
}
l++; //左指针右移一位
}
}
return s.substr(subStart, minLength);
};