题目:抽象点说,就是在一个字符串中,找一些目标字符串,找到包含所有目标字符串的最小字符串。题目虽然叫做最短摘要生成,但和实际的搜索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;
}