最短摘要-编程之美

本文参考编程之美上的算法二,

算法思想:

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;  
}  

    原文作者:siliang13
    原文地址: https://blog.csdn.net/siliang13/article/details/39808515
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞