记L,R为当前检查子串的最左端和最右端。
1.刚开始让L和R为0。
2.然后R一直往右,直到找到第一个满足要求的子串。记录此时的子串长度。
3.让L往右,直到子串第一次不满足要求,记录这个过程中最短的满足要求的子串长度。
4.此时的子串是不满足要求的,重复第2,3步骤。
class Solution {
public:
string minWindow(string s, string t) {
int need[130], cur[130];
memset(need,0,sizeof(need));
memset(cur,0,sizeof(need));
int l=0,r=0;
int match=0, requir = 0,ans=INT_MAX, ansi=0;
for(char &c:t) ++need[c];
for(int i=0;i<130;++i) {
if(need[i]) ++requir;
}
while(r<s.size()){
if(need[s[r]]){
++cur[s[r]];
if(cur[s[r]]==need[s[r]]) ++match;
}
while(match==requir){
if(ans>r-l+1){
ans = r-l+1;
ansi = l;
}
if(need[s[l]]){
--cur[s[l]];
if(cur[s[l]]<need[s[l]]) --match;
}
++l;
}
++r;
}
return ans==INT_MAX? "":s.substr(ansi,ans);
}
};