您的位置:首页 > 其它

字符串的最小窗口问题

2016-05-11 10:13 274 查看
给定两个字符串T和S,找出在S中包含字符串T的最小子字符串,要求时间复杂度为O(n)。

如果不存在最小窗口,则返回”“;

例如,

S =
"ADOBECODEBANC"


T =
"ABC"


返回的最小窗口是
"BANC"
.

实验的代码如下所示:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
string minWindow(string &S, string &T)
{
int Slen = S.length();
int Tlen = T.length();
if (Slen < Tlen || T.empty())
{
return "";
}
vector<int> ToBeFind(128, 0);
vector<int> Found(128, 0);
for (int i = 0; i != Tlen; ++i)
{
ToBeFind[T[i]]++;
}
int Count = Tlen;
int first = 0;
int last = 0;
int minfirst = 0;
int minlast = 0;
int minlength = INT_MAX;
Found[S[0]]++;
if (Found[S[0]] <= ToBeFind[S[0]])//先比较第一个字符是为了处理T为单个字符的特例
{
Count--;
}
while (true)
{
if (Count == 0)
{
while (Found[S[first]] > ToBeFind[S[first]])
{
Found[S[first]] --;
first++;
}
int length = last - first + 1;
if (length < minlength)
{
minfirst = first;
minlast = last;
minlength = length;
}
}
if (last < Slen)
{
last++;
Found[S[last]]++;
if (Found[S[last]] <= ToBeFind[S[last]])
{
Count--;
}
}
else
{
break;
}
}
if (minlength == INT_MAX)
{
return "";
}
return S.substr(minfirst, minlength);
}
int main()
{
string S1 = "ADOBECODEBANC";
string S2 = "ABC";
string S3 = "A";
cout << minWindow(S1, S2) << endl;
cout << minWindow(S3, S2) << endl;
system("pause");
return 0;
}
实验结果如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: