leetcode#76 最小覆盖字串
题目:
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
思路:
滑动窗口
滑动窗口右边界右移直到包括所有字母为止,当满足条件时,左边边界一直左移,直到不满足条件时,上一个窗口大小就是目前最小答案。
用unordered_map存储目标字母次数,当窗口里面的目标字母次数全部大于满足条件时,说明窗口包含了所有字母。
代码:
class Solution
{
public:
unordered_map<char, int> mp, tmp;
bool check()
{
for (const auto &p : mp)
if (tmp[p.first] < p.second)
return false;
return true;
}
string minWindow(string s, string t)
{
int len_s = s.length(), len_t = t.length();
for (int i = 0; i < len_t; ++i)
mp[t[i]]++;
int i = 0, j = 0, ans = 0x3f3f3f3f, bg = 0;
while (j < len_s)
{
if (mp.find(s[j]) != mp.end())
tmp[s[j]]++;
++j;
while (check() && i < j)
{
if (j - i < ans)
{
ans = j - i;
bg = i;
}
if (mp.find(s[i]) != mp.end())
tmp[s[i]]--;
++i;
}
}
if (ans == 0x3f3f3f3f)
ans = 0;
return s.substr(bg, ans);
}
};