编程之美最短摘要生成

来源:互联网 发布:淘宝高仿大牌女包推荐 编辑:程序博客网 时间:2024/06/03 20:33

本来以为这个会很难的,因为自己不是很了解这方面的东西。

看了下解释 大致明白了,就是用最少的句子 ,包含所有的关键词。

ok~看了编程之美的code后 感觉很好,类似kmp算法,跳过已经比对过的字符串,然后向后移动。

曾经做过一个单调队列的,就是一个数组,移动滑动窗口,判断窗口里面的最大值最小值


思路就是

比如 我的关键词为 abde

我的句子  hello  are  you bottom of do the is bot doke astring.

在一个句子里面找到包含关键词的 最短的句子。当然 关键词可以无序排列。

编程之美的思路 就是

设置一个begin 一个end 起初都指向句子头

end向后移动一直到包含所有关键词 停止。

记录长度,同时移动begin,直至不包含某关键词后,再次移动end,直至包含。

总结来说  就是 一遍获得所有结果。不回溯

#include "stdio.h"#include "string.h"#include "assert.h"#define MAX 1024int isMatchAll(const char *str,const char *key,int begin,int end){int ret =0;char hash[256];int i =0;int lenK = strlen(key);memset(hash,0,sizeof(hash));for(i=begin;i<=end;i++){hash[str[i]]=1;}for(i=0;i<lenK;i++){if(hash[key[i]]==0)break;}if(i == lenK )ret =1;return ret;}void find(const char *str,const char *key){int lenS = strlen(str);int lenK = strlen(key);int begin = 0;int end = 0;int minLength = 0x7FFFFFFF;int mstart = 0;int mend =0;assert(str&&key);for(;;){while(!isMatchAll(str,key,begin,end)&&end<lenS){end++;}while(isMatchAll(str,key,begin,end)){if(end-begin+1 <minLength){minLength = end-begin+1;mstart =begin;mend =end;}begin++;}if(end>=lenS)break;}printf("%d\n",minLength);for(;mstart<=mend;mstart++)printf("%c",str[mstart]);}int main(){char str[MAX];char key[MAX];gets(str);gets(key);find(str,key);return 0;}




原创粉丝点击