一、题目描述

二、算法原理
思路:滑动窗口 + 双哈希表
我们可以统计 t 中每个字母的种类,不是个数,当我们遍历的 s 字符串时,我们也要定义一个 count 来记录符合 t 的有效字符,当 hash_s[ A ] == hash_t[ A ] ,count++,当 count == t 中每个字母的种类时,此时就是符合要求的字符串,但是我们要长度最小的字符串,所以我们还要定义两个变量:begin:有效字符串的起始下标,minlen :最小的有效字符串的个数;当 count == t 中每个字母的种类时,我们就要更新 begin 和 minlen 。
三、代码实现
cpp
class Solution {
public:
string minWindow(string s, string t) {
int kinds = 0;
char hash1[128] = {0};
for(auto e : t) if(hash1[e]++ == 0) kinds++;
int count = 0;
char hash2[128] = {0};
int minlen = INT_MAX, begin = -1;
for(int right = 0,left = 0; right < s.size();right++)
{
char in = s[right];
hash2[in]++;
if(hash2[in] == hash1[in]) count++;
while(count == kinds)
{
if(minlen > right - left + 1)
{
minlen = right - left + 1;
begin = left;
}
char out = s[left];
if(hash2[out] == hash1[out]) count--;
hash2[out]--;
left++;
}
}
if(begin == -1) return "";
else return s.substr(begin,minlen);
}
};
解题过程中的总结:不能使用容器:unordered_map 来记录每个字母的种类,因为当后面的我们判断 hash[out] == hash1[out] 时,此时容器的 size 会增加。
