编程之美--最短摘要的生成

题目:抽象点说,就是在一个字符串中,找一些目标字符串,找到包含所有目标字符串的最小字符串。题目虽然叫做最短摘要生成,但和实际的搜索snippet的计算还是有比较大的差距的。


解法:一种比较好的解法,策略还是使用双指针。

算法的思想是采用两个指针,开始两个指针都指向缓冲区的头部,尾指针向后扫描,直到头指针和尾指针中间包含了全部的关键字,那么头指针向后移动,直到包含全部关键字这个条件失败,这时截取字串并和已取得的最小字串比较,如果小则替换。头指针、尾指针都向后一个位置(这点很重要,开始就忘记了移动头指针,导致程序出错),继续扫描。

另外,由于一个关键字可能重复多次,因此在判断是否包含全部关键字时要采用计数机制,才能保证查看的准确。这样只要头指针和尾指针扫描两次字符串就可以完成生成算法。

int nTargetLen=N+1;//设置目标长度为总长度加1

int nLen=N;//初始指针

int pbegin=0;//结束指针

int pend=0;//目标数组的长度为N

int abstractStart=0;//目标摘要的起始地址

int abstractEnd=0;//目标摘要的结束地址

while(true)
{
	//假设包含所有的关键词,并且后面的指针没有越界,往后移动指针
	while(!isAllexist() && pend<N)
	{
		pend++;
	}
	//假设找到一段包含所有关键词信息的字符串
	while(isAlliext())
	{
		if(pend-pbegin < nTareLen)
		{
			nTargetLen=pEnd-pBegin;
			abstracStart=pbegin;
			abstartEnd=pEnd-1; //多包含了一个
		}
		pBegin++;
	}
	if(pEnd>=n) //注意是等于
		break;
}

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