目录
一、最小覆盖子串
题目:
思路:滑动窗口+哈希表
计算两个字符串的长度,定义两个哈希表,用其中一个哈希表先统计字符串t的字符出现个数
定义变量count,统计有效字符的个数,用法与上一篇博客的两题一样,先进窗口,再判断count++;先判断count–,再出窗口
判断条件:count == 字符串t的长度。
返回值:定义返回值ret,在判断里面截取字符串tmp,这里需要一个临时的字符串str,每次截取后赋值给str,然后如果ret为空,str直接给ret;ret不为空,比较ret和str的长度,只有str的长度小于ret的长度,才把str赋值给ret
代码:
class Solution {
public:
string minWindow(string s, string t) {
int slen = s.size(), tlen = t.size();
int hash1[128] = {0};
int hash2[128] = {0};
for(auto e:t) hash2[e]++;
string ret;//返回值
string str;//临时字符串
int left = 0, right = 0, count = 0;//统计字符的有效个数
while(right < slen)
{
hash1[s[right]]++;//先进窗口
if(hash1[s[right]] <= hash2[s[right]]) count++;//再判断
while(count == tlen)//满足截取的字符串条件
{
string tmp = s.substr(left, right-left+1);//截取的字符串
str = tmp;
if(ret == "") ret = str;
else
{
if(str.size() < ret.size()) ret = str;
}
if(hash1[s[left]] <= hash2[s[left]]) count--;//先判断
hash1[s[left]]--;//再出窗口
left++;
}
right++;
}
return ret;
}
};