我们在s上滑动窗口,通过移动right指针不断扩张窗口。当窗口包含t全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。
在滑动窗口类型的问题中都会有两个指针,一个用于延伸现有窗口的right指针,和一个用于收缩窗口的left指针。在任意时刻,只有一个指针运动,而另一个保持静止。
如何判断当前的窗口包含所有t所需的字符呢?
首先,s和t中都可能出现重复的字符,所以我们要使用容器记录字符的个数。
哈希表needDict:保存所需字符的数量,即t中所有的字符以及它们的个数。
哈希表windowDict:保存当前滑窗[left,right]中存在的需要的字符的数量,所以在改变left和right的同时需要同步维护区间内字符的数量。
区间[left,right] 滑动窗口,左闭右开,经历过程:扩大---更新---覆盖---缩小---更新。窗口中包含t的字符,left右移,否则right右移。
区间[start,end] 暂存当前找到的最小覆盖子串,即最小间距的[left,right],遍历完后就是最小覆盖子串的区间范围。
minLen 记录当前找到的最小覆盖子串的长度。
matchCnt 当前滑动窗口中匹配的个数