本文参考编程之美上的算法二,
算法思想:
1,设定双指针,前后指针,当关键字未包含在指针区间字符串中,则后指针向前移动,直到全部包含且后指针必须在长度以内;
2,当全部包含了关键字后,将前指针移动,直到不能全部包括停止;
3,计算前后指针距离,与开始距离比较,替换;
4,重复1,2,3直到后指针等于长度停止。
代码如下
#include <iostream>
#include <string>
#include <assert.h>
#include <vector>
using namespace std;
int isAllKeyIn(vector<string> &d,vector<string> &q,int start,int end)
{
assert(0!=d.size()&&0!=q.size());
if (start>end)
{
return 0;
}
int i=0;
for (int j=start;j<end;j++)
{
if (q[i].compare(d[j])==0)
{
i++;
}
if (i==3)
{
return 1;
}
}
return 0;
}
void findShortAbstract(vector<string> &d,vector<string> &q,int &abstractStart,int &abstractEnd)
{
int len=d.size();
int ntagetlen=len+1;
int pbegin=0;
int pend=0;
while(1)
{
while(!isAllKeyIn(d,q,pbegin,pend))
{
pend++;
}
while(isAllKeyIn(d,q,pbegin,pend))
{
if (pend-pbegin<ntagetlen)
{
ntagetlen=pend-pbegin;
abstractEnd=pend-1;
abstractStart=pbegin;
}
pbegin++;
}
if (pend>=len)
{
break;
}
}
}
int main(){
string doc[]={"I", "like", "you","and","like" ,"him","me", "do", "you","want", "like" , "me"};
string query[]={ "you", "like", "me"};
vector<string> d(doc,doc+sizeof(doc)/sizeof(string));
vector<string>q(query,query+sizeof(query)/sizeof(string));
int a=0,b=0;//最短摘要前后指针位置
findShortAbstract(d,q,a,b);
cout<<a<<" "<<b<<endl;
for (int i=a;i<=b;i++)
{
cout<<doc[i]<<",";
}
system("pause");
return 0;
}