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.
思路:中心思想,窗口有效字符达标之后,搜索窗口第二个有效字符,作为起始位。
class Solution {
public:
string minWindow(string s, string t) {
int minLen = INT_MAX;
int need[128] = { 0 };
int own[128] = { 0 };
int n = s.size();
int m = t.size();
for (int i = 0; i < m; i++)
need[t[i]]++;
int low = 0;
while (need[s[low]] == 0) low++; //low指向第一个需要的字符;
if (low == n) return "";
own[s[low]]++;
int high = low;
int res = low;
int len = 1; //记录窗口中已经符合要求的字符串数
while (high < n){
//cout << low << endl;
//cout << res << endl;
if (len < m){ //有效字符未满
high++; //往右搜索符合要求的字符串
if (high == n) break;
if (own[s[high]] < need[s[high]]) //当前字符符合要求且未达到数量要求
len++;
own[s[high]]++;
}
if (len == m){
//cout << "low=" << low << "high=" << high << endl;
if ((high - low + 1) < minLen){
minLen = high - low + 1;
res = low;
//cout << "res= " << res << endl;
}
own[s[low]]--;
if (own[s[low]]<need[s[low]]) //
len--;
low++;
while (need[s[low]]==0){ //low往前搜索,找到下一个need字符
low++;
}
}
}
if (minLen == INT_MAX)
return "";
else
return s.substr(res,minLen);
}
};