Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.
算法
O(N)
快慢指针,块指针跑到位置,然后再向前缩进慢指针;
计算匹配可以使用hash或者是数组
class Solution {
private:
int sta[255]={0};
int wnd[255]={0};
public:
string minWindow(string s, string t) {
if(s.empty()||t.empty())
return "";
int slen=s.length(),tlen=t.length();
int res_pos=0; //position of result
int min_len=INT_MAX;
int count=0; //match count in windows
int slow=0,fast=0;
//deal T
for(int i=0;i<tlen;++i)
++sta[t[i]];
//count
for(int fast=0;fast<slen;++fast){
int idx=s[fast];
++wnd[idx];
if(wnd[idx]<=sta[idx])
++count;
//match enough
if(count>=tlen){
while(wnd[s[slow]]>sta[s[slow]])
--wnd[s[slow++]]; //euqal to: wnd[s[slow]]--; slow++
if(fast-slow+1<min_len){
min_len=fast-slow+1;
res_pos=slow;
}
//make it not enough again
--wnd[s[slow++]];
--count;
}
}
return s.substr(res_pos,min_len==INT_MAX? 0:min_len);
}
};