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"​​.

Note:

If there is no such window in S that covers all characters in T, return the emtpy string ​​""​​.

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

采用双指针,end指针逐渐增加,当begin与end之间包含所有t后,后移begin,找到最小substr,并记录,最后输出最小substr。边界条件,begin处的字母属于t且在该区域中仅出现t中的次数。



1 class Solution {
2 public:
3 string minWindow(string s, string t) {
4 int slen=s.size();
5 int tlen=t.size();
6 if(tlen==0||slen<tlen) return "";
7 int needfind[256]={0};
8 int hasfind[256]={0};
9 for(int i=0;i<tlen;i++)
10 {
11 needfind[t[i]]++;
12 }
13 int count=0;
14 int begin=0;
15 int end=0;
16 int minwindowsizetmp=0;
17 int minbegin=0;
18 int minend=slen-1;
19 int minwindowsize=INT_MAX;
20 for(count=0;end<slen;end++)
21 {
22 if(needfind[s[end]]==0)
23 continue;
24 hasfind[s[end]]++;
25 if(hasfind[s[end]]<=needfind[s[end]])
26 {
27
28 count++;
29 }
30
31 if(count==tlen)
32 {
33 while(begin<end)
34 {
35 if(needfind[s[begin]]==0)
36 {
37 begin++;
38 continue;
39 }
40 if(hasfind[s[begin]]>needfind[s[begin]])
41 {
42 hasfind[s[begin]]--;//若该行放到begin++下边,则会出现下述错误,谨记。
43 begin++;
44
45 continue;
46 }
47 else
48 break;
49 }
50 minwindowsizetmp=end-begin+1;
51
52 if(minwindowsizetmp<minwindowsize)
53 {
54 minbegin=begin;
55 minend=end;
56 minwindowsize=minwindowsizetmp;
57 }
58 }
59 }
60 if(minwindowsize==INT_MAX)
61 return "";
62 return s.substr(minbegin,minwindowsize);
63 }
64 };


 


wrong answer:


Input:"ADOBECODEBANC", "ABC"


Output:"ANC"


Expected:"BANC"