题目链接:76. 最小覆盖子串
算法实现,利用双指针,滑动窗口进行解决,
利用两个哈希表进行解决,讲字符串t全部放入一个哈希表中,
然后利用滑动窗口对字符串s进行插入删除操作,
利用一个变量count来记录有效字符
直接看代码注释:
cpp
class Solution {
public:
string minWindow(string s, string t) {
map<char, int> h1;
for (auto e : t) h1[e]++;
map<char, int> h2;
int retleft = 0;
int ret = INT_MAX;
for (int left = 0, right = 0, count = 0; right < s.size(); right++)
{
//如果有效字符数和t.size()不相同,就一直进窗口,直到相同
h2[s[right]]++;
if (h2[s[right]] <= h1[s[right]]) count++;
//判断,如果有效字符数和t.size()相同,就进循环判断
while (count == t.size())
{
//如果此时位置处在有效字符上,就直接进行判断范围是否为较小范围
//因为此时有效字符相同,且left位置刚好是有效字符,那么此时[left,right]一定有效
if (h1.count(s[left]))
{
if (right - left + 1 < ret)
{
//记录最小范围
retleft = left;
ret = min(ret, right - left + 1);
}
}
//移动left,缩小区间 ,继续寻找更小范围
if (h2[s[left]] <= h1[s[left]]) count--;
h2[s[left]]--;
left++;
}
}
if(ret == INT_MAX) return "";//如果此时ret == INT_MAX,那么此时一定没找到,返回空
return s.substr(retleft,ret);//直接利用substr获取出最小范围的字符串
}
};