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.
解题思路:用两个标志位分别表示满足条件的字符串的头尾。尾部索引号确定利用满足当前字符串包含目标字符条件,起始的字符串确定起来比较麻烦,首先若起始的字符为目标字符,且已经搜索到的个数大于目标搜索数,则跳过,其次首字符不是目标字符也跳过;基本按这样的思路写就可以确定符合条件的字符串了,最后通过遍历确定最短的字符串即可。
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
string minWindow(string S, string T) {
map<char, int>SubstrMap; //目标字典(字符,相应个数)
map<char, int>BesearchedMap; //已搜索到的字典
for (auto &str : T)
SubstrMap[str]++;
int CountBesecrsh = 0;
int minLength = INT_MAX;
int minSubstrBegin = 0;
int idx_begin = 0;
for (int idx_end = 0; idx_end != S.size(); ++idx_end){
if (SubstrMap.find(S[idx_end]) != SubstrMap.end())
{
BesearchedMap[S[idx_end]]++;
if (BesearchedMap[S[idx_end]]<=SubstrMap[S[idx_end]])
CountBesecrsh++;
if (CountBesecrsh==T.size()) //表示当前搜索点为尾的字符串满足搜索条件
{
while (idx_begin<=idx_end)
{
if (SubstrMap.find(S[idx_begin]) == SubstrMap.end()){
idx_begin++;
continue;
}
else if (BesearchedMap[S[idx_begin]] > SubstrMap[S[idx_begin]]){
BesearchedMap[S[idx_begin]]--;
idx_begin++;
continue;
}
else
break;
}
int length = idx_end + 1 - idx_begin;
if (length<minLength)
{
minLength = length;
minSubstrBegin = idx_begin;
}
}
}
}
if (minLength == INT_MAX)
return "";
return S.substr(minSubstrBegin, minLength);
}