题目链接:76. 最小覆盖子串
算法实现,利用双指针,滑动窗口进行解决,
利用两个哈希表进行解决,讲字符串t全部放入一个哈希表中,
然后利用滑动窗口对字符串s进行插入删除操作,
利用一个变量count来记录有效字符
直接看代码注释:
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获取出最小范围的字符串}
};