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 = i = 0
2、i 逐渐往后扫描S直到窗口S[start…i]包含所有T的字符,此时i = 6(字符c的位置)
3、缩减窗口:此时我们注意到窗口并不是最小的,需要调整 start 来缩减窗口。缩减规则为:如果S[start]不在T中 或者 S[start]在T中但是删除后窗口依然可以包含T中的所有字符,那么start = start+1, 直到不满足上述两个缩减规则。缩减后i即为窗口的起始位置,此例中从e开始窗口中要依次删掉e、b、a、d,start最后等于4 ,那么得到一个窗口大小为6-4+1 = 3
4、start = start+1(此时窗口肯定不会包含所有的T中的字符),跳转到步骤2继续寻找下一个窗口。本例中还以找到一个窗口start = 5,i = 8,比上个窗口大,因此最终的最小窗口是S[4…6]
/*
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
class Solution_076_MinimumWindowSubstring_1
{
private:
int count1[256];
int count2[256];
public:
string minWindow(string S, string T)
{
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (T.size() == 0 || S.size() == 0)
return "";
memset(count1, 0, sizeof(count1));
memset(count2, 0, sizeof(count2));
for (int i = 0; i < T.size(); i++)
{
count1[T[i]]++;
count2[T[i]]++;
}
int count = T.size();
int start = 0;
int minSize = INT_MAX;
int minStart;
for (int end = 0; end < S.size(); end++)
{
if (count2[S[end]] > 0)
{
count1[S[end]]--;
if (count1[S[end]] >= 0)
count--;
}
if (count == 0)
{
while (true)
{
if (count2[S[start]] > 0)
{
if (count1[S[start]] < 0)
count1[S[start]]++;
else
break;
}
start++;
}
if (minSize > end - start + 1)
{
minSize = end - start + 1;
minStart = start;
}
}
}
if (minSize == INT_MAX)
return "";
string ret(S, minStart, minSize);
return ret;
}
};