两个指针: i,j 开始均指向S开头,不断向后移动 j 直至从 i 到 j 能够包含T,之后要尝试移动 i ,同样要保证 i - j包含T。
class Solution {
public:
string minWindow(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(S.size() <= 0 || T.size() <= 0) return "";
const int MAX = S.size() + 1;
int base[260], cur[260];
memset(base, 0, sizeof(base));
memset(cur, 0, sizeof(cur));
int i, ans, start, end;
for(i = 0; i < T.size(); i ++)
{
base[T[i]] ++;
}
i = start = end = 0;
ans = MAX;
int len = T.size();
for(int j = 0; j < S.size(); j ++)
{
cur[S[j]] ++;
if(len > 0 && cur[S[j]] <= base[S[j]]) len --;
if(len == 0)
{
while(i < j && (base[S[i]] == 0 || cur[S[i]] > base[S[i]]))
{
cur[S[i]] --;
i ++;
}
if(j - i + 1 < ans)
{
ans = j - i + 1;
start = i;
end = j;
}
}
}
if(ans == MAX) return "";
return S.substr(start, ans);
}
};