给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
滑动窗口计算数组的长度
class Solution {
public:
string minWindow(string s, string t) {
int tFreq[256] = {0};
for(int i = 0 ; i < t.size() ; i ++)
tFreq[t[i]] ++;
int sFreq[256] = {0};
int sCnt = 0;
int minLength = s.size() + 1;
int startIndex = -1;
int l = 0, r = -1;
while(l < s.size()){
if(r + 1 < s.size() && sCnt < t.size()){
sFreq[s[r+1]] ++;
if(sFreq[s[r+1]] <= tFreq[s[r+1]])
sCnt ++;
r ++;
}
else{
assert(sCnt <= t.size());
if(sCnt == t.size() && r - l + 1 < minLength){
minLength = r - l + 1;
startIndex = l;
}
sFreq[s[l]] --;
if(sFreq[s[l]] < tFreq[s[l]])
sCnt --;
l ++;
}
}
if( startIndex != -1 )
return s.substr(startIndex, minLength);
return "";
}
};