题目:
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.
分析与解答:
这里默认T中不存在重复的字符。
两个指针从S[0]开始,右指针向右遍历,直到包含了所有关键字。然后每次再向右的时候,就检查左指针是否能向右移动。左指针向右移动的条件是,去掉S[left]也依然能包含所有关键字。
class Solution {
public:
string minWindow(string S, string T) {
string result = "";
vector<int> char_in_T(256,0);//存放T中的数据
for(string::size_type i = 0;i < T.size();++i){
char_in_T[T[i]]++;
}
vector<int> char_in_S(256,0);//存放S中所有的元素
int count = 0;//记录关键字出现的次数,当count==T.size()时,即找到一个包含所有关键字的序列
string::size_type left = 0,right = 0;
char c_right = 0,c_left = 0;
for(right = 0;right != S.size();++right){
char c_right = S[right],c_left = S[left];
if(char_in_S[c_right]++ < char_in_T[c_right]){
count++;
}
if(count == T.size()){//已经包含了所有关键字,就检测左指针是否能向右移动。
while(char_in_S[c_left] > char_in_T[c_left]){//这是多余字符
char_in_S[c_left]--;
c_left = S[++left];
}
if(right - left + 1 < result.size() || result == ""){
result = S.substr(left,right - left + 1);
}
}
}
return result;
}
};