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的区间,移动前指针到最优位置,判断一次,如此循环。
class Solution {
public:
string minWindow(string S, string T) {
int Need[256], Now[256];
for(int i = 0;i < 256; i++){
Need[i] = Now[i] = 0;
}
int LS = S.length();
int LT = T.length();
for(auto ch:T)
Need[ch] ++;
int i = 0, j = 0, foundNum = 0;
int minLength = LS + 1, Begin = 0, End = 0;
while(j < LS){
if(!Need[S[j]]){
j++;
continue;
}
Now[S[j]]++;
if(Now[S[j]] <= Need[S[j]])
++foundNum;
if(foundNum == LT){
while(Need[S[i]] == 0 || Now[S[i]] > Need[S[i]]){
if(Now[S[i]] > Need[S[i]])
--Now[S[i]];
i++;
}
int l = j - i + 1;
if(l < minLength){
minLength = l;
Begin = i;
End = j;
}
}
j++;
}
return minLength <= LS ? S.substr(Begin, minLength) :"";
}
};
本文介绍了一种在字符串S中寻找包含字符串T所有字符的最短子串的算法,复杂度为O(n)。通过前后双指针技术,后指针负责扩展搜索范围,前指针则用于收缩窗口至最小子串长度。
3611

被折叠的 条评论
为什么被折叠?



