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 empty string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
1. 使用start 和 end指针表示window的边界,count记录子串是否包含t中全部的char。2. 先向右移动end指针直至找到一个子串;然后向右移动start直至该有效子串的size最小。
3. 当start滑过t中的char后,count++表示当前子串不是有效的
4. unordered_map的中key如果不存在,map[key]++会赋值为1
5. 将unordered_map换成vector<int>(128,0)会更快
string minWindow(string s, string t) {
unordered_map<char, int> cmap;
for (char c: t) cmap[c]++;
int count = t.size(), start = 0, end = 0;
int minLen = INT_MAX, minStart = 0;
while (start <= end && end < s.size()){
if (cmap[s[end]]-- > 0) count--; //if exists in t,不在t中的char 或者 t中已经用光的char 的值为负
end++; //move end to right
while (count == 0){ //find a valid substr
if (cmap[s[start]]++ >= 0){ //if exists in t,
if (minLen > end - start){ //只有start滑过t中的char时,才有必要更新最小长度
minLen = end - start;
minStart = start;
}
count++;
}
start++; //move start to right
}
}
return minLen == INT_MAX ? "" : s.substr(minStart, minLen);
}