76. 最小覆盖子串
分析:[1]采用滑动窗口,窗口有左右边界,先通过扩展右边界找出一个包含T中所有字符的子串,然后收缩左边界,直到不能再收缩。记录此时的子串。然后收缩左边界,继续扩展右边界,直到再找到满足要求的子串,和上次的进行比较,保存更小的子串。返回执行,直到右边界到达S串尾,且左边界不能再收缩。
code:
class Solution {
public:
string minWindow(string s, string t) {
int slen = s.length(), tlen = t.length(),left=0,right=0,cnt=0, min_len = INT_MAX;
if (slen < tlen || slen == 0 || tlen == 0)return "";
string res = "";
unordered_map<char, int>m;
for (int i = 0; i < tlen; i++)
{
if (m.find(t[i]) == m.end())
m[t[i]] = 0;
m[t[i]]++;
}
while (right<slen)
{
if (m.find(s[right]) != m.end())
{
m[s[right]]--;//只要存在就右减减对称的就左加加
if (m[s[right]]>= 0)cnt++;
while (cnt == tlen)
{
//记录子串的信息
if (min_len > right - left + 1)
{
min_len = right - left + 1;
res = s.substr(left, min_len);
}
//收缩
if (m.find(s[left]) != m.end())
{
if (m[s[left]] >= 0)cnt--;
m[s[left]]++; //对称的就左加加
}
left++;
}
}
right++;//扩展
}
return res;
}
};
用一个126位数组代替哈希速度会快点但是思想是一样的。