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.
思路:使用两个指针,一个hash表,两个指针为了记录宽度,hash表为了记录是否存在,目标字符在两个指针之间出现了多少次,直到所有字符都出现在了这段子串内,移动前面的指针,直到某一个字符出现在子串中一次,那么这个空间的长度就是当前最短的,这样遍历直到把所有字符串遍历结束
#include <iostream>
#include <vector>
#include <string>
using namespace std;
/*
一个字符串能包含另一个字符串中所有字母的子串的最小长度
*/
string MinLength(string& src,string& dest)
{
int i=0,j=0;
int flag =0;
int len=src.size();
int pos=0;
vector<int> hash(26,-1);
for(i=0;i<dest.length();i++)
hash[dest[i]-'A'] =0;
// for(i=0;i<hash.size();i++)
// cout<<hash[i]<<endl;
for(i=0;i<src.size();i++)
{
if(hash[src[i]-'A'] >=0)
{
hash[src[i]-'A']++;
if(hash[src[i]-'A'] ==1)
flag++;
}
if(flag == dest.length())
{
//cout<<"=="<<endl;
// cout<<"j is "<<j<<" i is "<<i<<endl;
for(;j<i;j++)
{
if(hash[src[j]-'A'] == 1)
break;
else
hash[src[j]-'A']--;
}
if(len >i-j+1)
{
len = i-j+1;
pos =j;
}
hash[src[j]-'A'] = 0;
j++;
flag--;
}
}
cout<<string(src,pos,pos+len)<<" pos is "<<pos<<" len is "<<len<<endl;;
return string(src,pos,pos+len);
}
int main()
{
string src("ADOBECODEBANCAAABC");
string dest("ABC");
cout<<MinLength(src,dest);
return 0;
}Minimum Window Substring -- LeetCode
原文地址:http://blog.csdn.net/yusiguyuan/article/details/44801645