找出此产品描述中包含N个关键字的长度最短的子串
阿里巴巴笔试题:给定一段产品的英文描述,包含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个关键字的长度最短的子串的更多相关文章
- FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)
题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...
- Java - Collection 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- NLP任务:给定一句话,找出这句话中你想要的关键词,包括起始结束索引
在实际的nlp实际任务中,你有一大堆的人工标注的关键词,来新的一句话,找出这句话中的关键词,以便你以后使用,那如何来做呢? 1)用到正则的 finditer()方法,返回你匹配的关键词的迭代对象,包含 ...
- Java Collection - 003 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- [Python3 练习] 010 找出藏在字符串中的“密码”
题目:找出藏在字符串中的"密码" (1) 描述 1) 题源 1 Python Challenge, level 3 2) 题源 2 小甲鱼老师的 Python 课程,第 20 讲课 ...
- 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...
- Class 找出一个整形数组中的元素的最大值
目的:找出一个整形数组中的元素的最大值 以下,我们用类和对象的方法来做. #include<iostream> using namespace std; class Array_m ...
- [MSSQL]找出一天数据中从第一条数据开始每累加1小时的数据
用Sql Server找出一天数据中从第一条数据开始每累加1小时的数据 -- ============================================= -- Author: Alle ...
- 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca
今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...
随机推荐
- 10.php引用(&)详解及注意事项
<?php function &test() { static $b=0;//申明一个静态变量 $b=$b+1; echo $b; return $b; } $a=test();//这条 ...
- mysql几种引擎和使用场景
https://blog.csdn.net/cool_wayen/article/details/79585277 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建. ...
- wcf 开发 1
1.创建wcf应用程序 2.生成服务,启动 3.使用工具生成 文件如下: 4.新增加winform程序项目,并添加文件 service1.cs 修改app.config 5.代码调用 private ...
- docker 构建镜像 centos7 nginx php
#docker 构建镜像(Dockerfile) centos 7.4.1078镜像制作 nginx镜像制作(以前面centos7镜像为基础) Nginx+php镜像制作 更多操作实例,查看git里的 ...
- 流畅的python 对象引用 可变性和垃圾回收
对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...
- IOS研究之IOS7四种后台机制
IOS 7中,实际上APP拥有四种后台模式.不管是哪一种后台机制,均须要利用苹果给予的对应后台接口实现.IOS7系统中,开发人员能够灵活利用多种后台接口(API)实现更加智能的应用操作. 对获取 ...
- Struts 2 类型转换器 输入校验 拦截器
Struts 2中内建了字符串类型和常见类型之间相互转换的转换器,能满足大多数转换需求,但不能完成字符串和User对象之间的转换. OGNL项目中有一个TypeConvert接口,这个接口是自定义类型 ...
- java中jdk安装配置信息
由于被人比较懒,有些做过的事情总是好忘,这个也不例外,索性就做个随笔. JAVA_HOMEC:\Program Files (x86)\Java\jdk1.7.0_03CLASSPATH.;%JAVA ...
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace
Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace // Replace var reg: TPerlRegEx; begin reg := TPerlRe ...
- Matplot相关(二)——统计图
Matplotlib:其能够支持所有的2D作图和部分3D作图.能通过交互环境做出印刷质量的图像. ————————缩写定义———————— import matplot.pyplot as plt — ...