思路很简单,用尺取法即可;
代码中有一个优化,见initL和initR
;
举个例子s=XXXABCXXX,t=ABC
这个优化会将ABC两边的XXX去掉,因为是无用的状态;
Code
class Solution {
public:
unordered_map<char,int> umt,ums;
bool ck(){
for(const auto& x : umt){
if(ums[x.first]<x.second) return false;
}
return true;
}
string minWindow(string s, string t) {
if(t.size()>s.size()) return "";
for(const auto & x : t){
++umt[x];
}
int initL,initR,sz = (int)s.size();
//优化一下s
for(int i=0;i<sz;++i){
if(umt.count(s[i])){
initL = i;
break;
}
}
for(int i=sz-1;i>=0;--i){
if(umt.count(s[i])){
initR = i;
break;
}
}
s = s.substr(initL,initR-initL+1);
int L = 0,R = -1,pos = -1,minsz=0x3f3f3f3f;
sz = (int)s.size();
while(R<sz){
if(umt.count(s[++R])) ++ums[s[R]];
while(ck()){
if(R-L+1 < minsz){
pos = L;
minsz = R-L+1;
}
if(umt.count(s[L])) --ums[s[L]];
++L;
}
}
string ans = "";
if(pos != -1){
ans = s.substr(pos,minsz);
}
return ans;
}
};