编程之美读书笔记-最短摘要的生成
来源:互联网 发布:批量导入数据到excel 编辑:程序博客网 时间:2024/05/01 17:08
题目:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法string ExtractSummary(string description, string keywords[]),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。
解析:假设关键词序列为q0,q1,……,其它词序列为w0,w1,……。那么我们可以看看这样一个序列:
w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1
对于这个序列,符合条件的产品简介就是最后几个位置的词q0,w9,q1,最短的长度为3。
我们可以从W数组的第一个位置开始查找一段所有包含关键词数组Q的序列,再从第二个位置查找……这样复杂度很高。为了降低复杂度,我们需要把前后两次扫描的结果联系起来。沿用前面的扫描方法,再来看看。第一次扫描的时候,假设需要包含所有的关键词,将得到如下的结果。
w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1
那么,下次扫描应该怎么办呢?先把第一个被扫描的位置挪到q0处。
w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1
然后把第一个被扫描的位置继续往后面移动一格,这样包含的序列中将减少了关键词q0。那么,我们便可以把第二个扫描位置往后移,这样就可以找到下一个包含所有关键词的序列。
w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1
这样,问题就和第一次扫描时碰到的情况一样了。依次扫描下去,在w中找出所有包含q的序列,并且找出其中的最小值,就可得到最终的结果。
#include <string> #include <iostream> #include <algorithm> using namespace std;#define KeyWordNumber 3bool isAllExisted(string s1, string s2[]){for (int i = 0; i < KeyWordNumber; ++i){if (s1.find(s2[i]) == string::npos) return 0;}return 1;}string ExtractSummary(string description, string keywords[]){int nTargetLen = description.length();//设置最大目标长度int pBegin = 0;//初始指针int pEnd = 0;//结束指针int nAbstractBegin = 0;//目标摘要的起始地址int nAbstractEnd = 0;//目标摘要的结束地址while (1){//假设没有包含所有的关键词,并且后面的指针没有越界,往后移动指针while (pEnd < description.length()-1 && !isAllExisted(description.substr(pBegin, pEnd - pBegin + 1), keywords)){pEnd++;}//假设找到一段包含所有关键信息的字符串while (isAllExisted(description.substr(pBegin, pEnd - pBegin + 1), keywords)){if (pEnd - pBegin + 1 <= nTargetLen){nTargetLen = pEnd - pBegin + 1;nAbstractBegin = pBegin;nAbstractEnd = pEnd;}pBegin++;}if (pEnd >= description.length()-1) break;}return description.substr(nAbstractBegin, nAbstractEnd - nAbstractBegin + 1);}int main(){string text = "money is important than knife and money is can buy garden";string abstract[3];abstract[0] = "money";abstract[1] = "and";abstract[2] = "garden";string res = ExtractSummary(text, abstract);cout << res << endl;return 0;}
- 编程之美读书笔记--3.5 最短摘要的生成
- 编程之美读书笔记-最短摘要的生成
- 读书笔记之编程之美 - 3.5 最短摘要的生成
- 编程之美 最短摘要生成
- 编程之美之最短摘要生成的困惑
- 编程之美--最短摘要的生成
- 编程之美——最短摘要的生成
- 编程之美--3.5最短摘要的生成
- 编程之美--最短摘要的生成
- 最短摘要的生成(编程之美)
- 编程之美-3.5最短摘要的生成
- 编程之美----3.5最短摘要的生成
- 《编程之美》——最短摘要的生成
- 编程之美-最短摘要的生成方法整理
- 编程之美之最短摘要生成
- 编程之美--3.5最短摘要生成
- 编程之美--3.5最短摘要生成
- 编程之美: 第三章 结构之法 3.5最短摘要的生成
- Python文件读写
- 面向连接的套接字通信
- 在Mac系统中安装配置Tomcat及和Eclipse 配置
- windows message manager
- StringBuilder,StringBuffer的深入了解
- 编程之美读书笔记-最短摘要的生成
- #define和const struct 与 union的区别
- Foundation
- Python简介
- 【以太坊】Definitions of Data Structure
- Bootstrap vs Foundation
- html5中介绍的是拖动一个元素到指定的元素框内
- Linux系统启动在inittab和rc里面添加启动程序问题
- 联想天逸笔记本关闭Fn功能,直接使用F1~12键