题目:
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
示例1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
示例2:
输入: s = “a”, t = “aa”
输出: “”
方法及思路:
采用双指针滑动窗口方法,用两个哈希表,一个哈希表存放t中所有字符以及它们的个数;一个哈希表动态存放滑动窗口中包含t的字符和对应字符的个数。
代码:
class solution{
public:
unordered_map<char,int> need, window;
//检查滑动窗口是否是可行窗口,即滑动窗口中包含t中所有字符,且对应字符的个数均不小于t中字符的个数
bool check(){
for(const auto &p:need){
if(window[p.first]<p.second){
return false;
}
}
return true;
}
string minWindow(string s,string t)
{
for(const auto &c:t){
need[c]++;
}
int l = 0;r = -1;
int len = INT_MAX,ansL = -1;
while(r<int(s.size()))
{
if(need.find(s[++r])!=need.end())
{
window[s[r]]++;
}
if(check()&&l<=r)//窗口是可行的,则收缩左指针
{
if(r-l+1<len)
{
len = r-l+1;
ansL = l;
}
if(window.find(s[l])!=window.end())
{
window[s[l]]--;
}
l++;
}
}
return ansL==-1? string():s.substr(l,len);
}
};
复杂度分析:
时间复杂度:哈希表的大小和字符集有关,设字符集大小为C,O(C*|s|+|t|)。
空间复杂度:两张哈希表,O©。