class Solution {
public:
string minWindow(string s, string t) {
int valid=0,l=0,r=0;
string ans;
unordered_map<char,int> win,need;
for(auto i : t){
need[i]+=1;
}
while(r<=s.size()){
if(valid<t.size()){
if(need.count(s[r])){
if(win[s[r]]<need[s[r]]){
valid+=1;
}
win[s[r]]+=1;
}
r+=1;
}
else if(valid==t.size()){
if(ans.empty() || r-l<ans.size())
ans=s.substr(l,r-l);
if(need.count(s[l])){
win[s[l]]-=1;
if(win[s[l]]<need[s[l]]){valid-=1;}
}
l++;
}
}
return ans;
}
};
超出时间限制 看了评论区的这个题解 发现再中间也可以更新窗口 去掉不需要的左边
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char,int>ht,hs;
for(char c:t) ht[c]++;
string res;
int cnt=0;
for(int i=0,j=0;i<s.size();i++)
{
hs[s[i]]++;
if(hs[s[i]]<=ht[s[i]]) ++cnt;
while(j<i&&hs[s[j]]>ht[s[j]]) hs[s[j++]]--;
if(cnt==t.size())
{
if(res.empty()||res.size()>i-j+1) res=s.substr(j,i-j+1);
}
}
return res;
}
};
最终版本
class Solution {
public:
string minWindow(string s, string t) {
int valid=0,l=0,r=0;
string ans;
unordered_map<char,int> win,need;
for(auto i : t){
need[i]+=1;
}
while(r<=s.size()){
if(need.count(s[r])){
if(win[s[r]]<need[s[r]]){
valid+=1;
}
win[s[r]]+=1;
}
r+=1;
while(need.count(s[l])&&win[s[l]]>need[s[l]])
{cout<<s[l]<<l<<endl;win[s[l]]-=1; l++;}
while(valid==t.size()){
if(ans.empty() || r-l<ans.size())
ans=s.substr(l,r-l);
if(need.count(s[l])){
win[s[l]]-=1;
if(win[s[l]]<need[s[l]]){valid-=1;}
}
l++;
}
}
return ans;
}
};