阿里巴巴笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文关键词,请说明思路并变成实现方法。

String extractSummary(String description , String[] keyWords)

目标:找出此产品描述中包含N个关键字的长度最短的子串(20分)

W0 W1 W2 W3  Q0 W4 W5 Q1 W6 W7 W8 Q0 W9 Q1

P335 《编程之美》上的参考代码:

int nTarget = N + 1;

int pBegin = 0;

int pEnd = 0;

int nLen = N;

int nAbstractBegin = 0;

int nAbstractEnd = 0;

while(true)

{

while(!isAllExisted() && pEnd < nLen)

pEnd++;

while(isAllExisted())

{

if(pEnd - pBegin < nTargetLen)

{

nTarget = pEnd - pBegin;

nAbstractBegin = pBegin;

nAbstractEnd = pEnd - 1;

}

pBegin++;

}

if(pEnd >= N)

break;

}

1.将传入的keyWords[]生成哈希表,以便字符串比较 P337

struct keyWords{

int cnt;

char key[];

int hash;

}

2.struct keyWord{当前扫描到的一个关键词

int start;

KeyHash* key;

KeyWord* next;

KeyWord* prev;

}

3.全局变量

KeyWord* head;

KeyWord* tail;

int minLen;

int minStartPos;

int needKeyCnt;

4.扫描文章,每扫描到一个关键字时,就建立一个KeyWord,并连入双向链表中。

更新head,tail

对应KeyHash结构中的cnt+1

若cnt 0 - 1,则needKeyCnt - 1;

5.needKeyCnt = 0时,扫描到了全部关键字

链表头优化

若cnt大于1,说明摘要中还有相同;

跳过,cnt-1

直至某个链表头对应KeyHash中的cnt为1,此事该结构不能少了。

6.如果找到更短的minLength,更新minLength和minStartPos;

7.开始新一轮搜索

摘除链表第一个节点

needKeyCnt + 1;

下一节点 - 链表头,开始优化。

*搜索从上一次搜索结束处开始,不用回溯,一直沿文章向下。

7.实际意义:摘要应该包含完整的句子

struct Sentence

{

int start;

int end;

KeyWord* StartKey;

KeyWord* endKey;

Sentence* prev;

Sentence* next;

}

扫描到一个完整句子的结束

Sentence头结点优化

句子全部key的cnt-1;才去掉句子

更新HashKey

直至句子包含只出现一次的关键字

扩展问题:

如何判断两个页面相似。

找出此产品描述中包含N个关键字的长度最短的子串的更多相关文章

  1. FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)

    题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...

  2. Java - Collection 高效的找出两个List中的不同元素

    如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...

  3. NLP任务:给定一句话,找出这句话中你想要的关键词,包括起始结束索引

    在实际的nlp实际任务中,你有一大堆的人工标注的关键词,来新的一句话,找出这句话中的关键词,以便你以后使用,那如何来做呢? 1)用到正则的 finditer()方法,返回你匹配的关键词的迭代对象,包含 ...

  4. Java Collection - 003 高效的找出两个List中的不同元素

    如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...

  5. [Python3 练习] 010 找出藏在字符串中的“密码”

    题目:找出藏在字符串中的"密码" (1) 描述 1) 题源 1 Python Challenge, level 3 2) 题源 2 小甲鱼老师的 Python 课程,第 20 讲课 ...

  6. 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页

    使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...

  7. Class 找出一个整形数组中的元素的最大值

    目的:找出一个整形数组中的元素的最大值   以下,我们用类和对象的方法来做.   #include<iostream> using namespace std; class Array_m ...

  8. [MSSQL]找出一天数据中从第一条数据开始每累加1小时的数据

    用Sql Server找出一天数据中从第一条数据开始每累加1小时的数据 -- ============================================= -- Author: Alle ...

  9. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca

    今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...

随机推荐

  1. Linux磁盘管理命令(fdisk,mount,umount,mkfs)

    查看磁盘:fdisk -l 一块磁盘可以分14个分区 [root@wendyhost ~]# fdisk -l Disk /dev/sda: 64.4 GB, 64424509440 bytes 25 ...

  2. <2014 05 21> 互联网时代的C语言——Go

    Go希望成为互联网时代的C语言. 多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,将C++的面向对象进一步发扬光大.但是Go语言的设计者却有不同的看法,他们认为C++ 真的没啥好学的, ...

  3. 收藏:几种开源许可证的区别!——By 阮一峰制作

    乌克兰程序员Paul Bagwell,画了一张分析图,下面是阮一峰制作的中文版,非常棒,绝对的好东西,收藏这张图供日后查看:

  4. HDU1421:搬寝室(线性dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1421 又是一道,没有思想的题,看了题解,我发现我的dp题几乎都看了题解,我总是想不好状态转移方程,汗颜,以 ...

  5. pandas(三)汇总和计算描述统计

    pandas对象有一些常用的数学和统计的方法,大部分都属于约简或汇总统计. SUM方法 DataFrame对象的sum方法,返回一个含有列小计的Series >>> df = Dat ...

  6. Python中的lambda、map和filter

    翻译.修改自https://medium.com/@happymishra66/lambda-map-and-filter-in-python-4935f248593 1.lambda lambda运 ...

  7. c++ ScopeExitGuard

    说到Native Languages就不得不说资源管理,因为资源管理向来都是Native Languages的一个大问题,其中内存管理又是资源当中的一个大问题,由于堆内存需要手动分配和释放,所以必须确 ...

  8. 用Tchromium替换webbrowser

    用Tchromium替换webbrowser 用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了. 要把用习惯的EmbeddedWB换成完全不一样的TChr ...

  9. 练T25- focus必看!所有成功截图汇总

    http://www.guokr.com/post/565880/ 25914人加入此小组 发新帖 练T25- focus必看!所有成功截图汇总! 读图模式 作家向威 作家 2014-02-22 07 ...

  10. oracle 建立新的表空间

    创建数据表空间 注意粗斜体部分 create tablespace 表空间名称logging datafile 'D:\app\Administrator\oradata\orcl\XXXX.dbf' ...