【ATT】Minimum Window Substring
O(n)的解法。
[i,j]维护一个window,当cnt==tlen时表示这是一个valid window. Increment cnt by one if hasFound[x] is less than or equal to needToFind[x]. Why? When the constraint is met (that is, count equals to T's size), we immediately advance begin pointer as far right as possible while maintaining the constraint.
needed[] stores the total count of characters in T.
Founded[] stores the total count of character met in the cur mindow.
cnt的技术
string minWindow(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(S.empty()||T.empty())
return "";
int needed[256] = {0};
int found[256] = {0};
//precompute
int i,j;
for(i=0;i<T.size();i++)
needed[T[i]]++;
i = j = 0;
int slen = S.size();
int tlen = T.size();
int min_window = INT_MAX;
int startIndex=-1;
int cnt = 0;
while(j<slen)
{
if(needed[S[j]]==0) //skip the character not in T
{
++j;
continue;
}
found[S[j]]++;
if(found[S[j]]<=needed[S[j]]) //<= increment cnt
cnt++;
if(cnt==tlen) //met a valid window
{
while(needed[S[i]]==0||found[S[i]]>needed[S[i]]) // advance the begin pointer as far as possbile
{
if(found[S[i]]>needed[S[i]])
found[S[i]]--;
i++;
}
if(j-i+1<min_window) //update
{
min_window = j-i+1;
startIndex = i;
}
}
++j;
}
if(startIndex==-1)
return "";
else
return S.substr(startIndex,min_window);
}
浙公网安备 33010602011771号