给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
map记录目标串,开两个下标维护最短长度。
static const auto _=[](){
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> t_mp;
for (int i = 0; i < t.size(); ++i)
{
if (t_mp.find(t[i]) == t_mp.end())
{
t_mp[t[i]] = 1;
}
else
{
t_mp[t[i]] = t_mp[t[i]] + 1;
}
}
int l = 0, r = 0, num = 0, min_len = s.size() + 1;
string ans = "";
while (r < s.size())
{
if (t_mp.find(s[r]) != t_mp.end())
{
--t_mp[s[r]];
if (t_mp[s[r]] >= 0)
{
++num;
}
while (num == t.size())
{
if (r - l + 1 < min_len)
{
min_len = r - l + 1;
ans = s.substr(l, min_len);
}
if (t_mp.find(s[l]) != t_mp.end())
{
++t_mp[s[l]];
if (t_mp[s[l]] > 0) --num;
}
++l;
}
}
++r;
}
return ans;
}
};