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.
双指针,维护一个window。
//two pointers algorithm //自己写的太复杂了,看了一下例解,很简单。直接不用考虑这么多情况 //它用的是一个255长的数组来当hashtable来用,因为字符串中只有ascii码 //并且更新window的算法也比我这个简单,需要有时间再优化一遍,推倒重写。 class Solution { public: void addToMap(unordered_map<char, int> &map, unordered_map<char, int> &temp_map, char &c, size_t &size){ //first element in this key if(temp_map.find(c) == temp_map.end()){ temp_map[c] = 1; } else{ temp_map[c] += 1; } if(temp_map[c] == map[c]){ size++; } } void removeFromMap(unordered_map<char, int> &map, unordered_map<char, int> &temp_map, char &c, size_t &size){ temp_map[c] -= 1; if(temp_map[c] == map[c] - 1){ size--; } } string minWindow(string s, string t) { unordered_map<char, int> map; unordered_map<char, int> temp_map; if(t.empty() || s.empty()){ return ""; } //initialize map for(size_t i = 0; i < t.size(); i++){ char c = t[i]; //not find in map if(map.find(c) == map.end()){ map[c] = 1; } //find in map, add 1 else{ map[c] += 1; } } //two pointers size_t p = 0, q = 0; size_t temp_map_size = 0; int startIndex = -1; int length = 0; //find first character in string s that is contained in string t while(p < s.size()){ char c = s[p]; //found in string t if(map.find(c) != map.end()){ q = p; break; } else{ p++; } } //string s do not contain any characters in string t if(p == s.size()){ return ""; } addToMap(map, temp_map, s[p], temp_map_size); //finish if(temp_map_size == map.size()){ startIndex = q; length = p - q + 1; return s.substr(startIndex, length); } //not finish, move on p++; while(p < s.size()){ char c = s[p]; //not found in map if(map.find(c) == map.end()){ p++; continue; } else{//found in map addToMap(map, temp_map, c, temp_map_size); //fount a suitable window if(temp_map_size == map.size()){ //first result if(startIndex == -1){ startIndex = q; length = p - q + 1; } //not first result else{ if (p - q + 1 < length){ startIndex = q; length = p - q + 1; } } //move q pointer while(q < p){ char c = s[q]; //not found in map, move q again if(map.find(c) == map.end()){ q++; } //found in map else{ //still a suitable window //bug here if(temp_map_size == map.size()){ if(p - q + 1 < length){ startIndex = q; length = p - q + 1; } q++; removeFromMap(map, temp_map, c, temp_map_size); } //not a suitable window else{ break; } } } //now q points to a character in map p++; } //doesn't find a suitable window yet else{ p++; } } } //not found a suitable window if(startIndex == -1){ return ""; } else{ return s.substr(startIndex, length); } } };