leetcode : Minimum Window Substring
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.
分类是 hash table, two points, string
表示没思路的时候,看看tags还是很有帮助的。。。
思路就是两个指针一个start,一个end,分别处于第一个window的开始跟末尾,然后end向右移动直到遇见第一个等于S[start]的字符处停下,然后向右移动start直到不能移动,然后计算宽度,并且保留最小宽度时的start跟end
如何判断是否是一个window 需要预处理,即声明两个hash table,一个表示当前window的各个字符的数量,另一个表示T串中各个字符的数量。因为ascii码就128个,所以用一个128位的数组即可实现hash table。
AC代码:
class Solution { public: string minWindow(string S, string T) { vector<int> t(128,0); vector<int> window(128,0);
//预处理,记录T中各个字符的状况 for(int i = 0; i < T.size(); ++i) ++t[T[i]]; int start = 0, end = 0, count = 0; string ret;
//预处理,找第一个end while(end < S.size()){ if(t[S[end]] == 0) ++end; else{ if(window[S[end]]++ < t[S[end]]) //当count == T.size()说明第一个end找到了 ++count; if(count == T.size()) break; else ++end; } } if(count != T.size()) return ret; while(1){ // 将start最大化得向右靠拢 if(window[S[start]] == 0) ++start; else if(window[S[start]] > t[S[start]]){ --window[S[start++]]; }else break; } int minStart = start, minEnd = end; while(end < S.size()){ end = end + 1; //end左移 while(end < S.size()){ if(window[S[end]] != 0) ++window[S[end]]; if(S[end] == S[start]) break; else ++end; } while(1){ //start右移 if(window[S[start]] == 0) ++start; else if(window[S[start]] > t[S[start]]){ --window[S[start++]]; }else break; } if(minEnd - minStart > end - start) minEnd = end,minStart = start; } return ret = S.substr(minStart, minEnd - minStart + 1); } };
浙公网安备 33010602011771号