/*算法核心思想如下: 在保证[begin,end]窗口包含T中所有字符的条件下,延伸end,收缩begin。 进行一次扫描后,记录符合条件的最小窗口(end-begin+1)表示的字符串。 有个问题:怎样才知道[begin,end]窗口包含了T中所有字符? 我使用count记录剩余“有效”字符数,当count达到0时,即可说明[begin,end]包含了T。 注意:“有效”的意思是指,当前延伸得到的S[end]字符,使得[begin,end]更进一步包含T,而不是重复劳动。 比如说,T="a", [begin,end]已经包含"a",再延伸得到"aa",只是无效操作,并没有使得[begin,end]更接近T,有效字符数仍为1. */ string minWindow(string S, string T) { int begin = 0; int end = 0; int minbegin = 0; int minend = 0; int minSize = INT_MAX; vector<int> needFind(128, 0); vector<int> Found(128, 0); for (int i = 0; i < T.size(); i++) needFind[T[i]] ++; Found[S[0]] ++; int count = T.size(); if (needFind[S[0]] >= Found[S[0]]) count--; while (true) { if (count == 0) {//shrink begin while (Found[S[begin]] > needFind[S[begin]]) { Found[S[begin]] --; begin++; } int size = end - begin + 1; if (size < minSize) { minbegin = begin; minend = end; minSize = size; } } if (end < S.size()) { end++; Found[S[end]] ++; if (needFind[S[end]] >= Found[S[end]]) count--; } else break; } if (minSize != INT_MAX) return S.substr(minbegin, minSize); else return ""; }
string minWindow(string S, string T) { // Start typing your C/C++ solution below // DO NOT write int main() function int lens = S.size(); int lent = T.size(); vector<int> needFind(256, 0); vector<int> hasFound(256, 0); for(int i = 0; i < lent; i++) { needFind[T[i]]++; } int minw = INT_MAX; string ret; int begin = 0; for(int i = 0; i < lens; i++) { if(needFind[S[i]] == 0) continue; hasFound[S[i]]++; if(hasFound[S[i]] <= needFind[S[i]]) lent--; if(lent == 0) { while(needFind[S[begin]] == 0 || hasFound[S[begin]] > needFind[S[begin]]) { if(hasFound[S[begin]] > needFind[S[begin]]) hasFound[S[begin]]--; begin++; } int curlen = i-begin+1; if(curlen < minw) { minw = curlen; ret = S.substr(begin, minw); } } } return ret; }