【编程之美】3.5 最短摘要的生成

题目:有搜索后的网页分词序列 数组W 其中W[0]、W[1]、...W[N]为分好的词。

用户输入的关键词为数组 Q 其中Q[0]、Q[1]...Q[M]为搜索的关键词。

找到W中最小的范围W[i]~W[j]让其包括所有的Q。

思路:

最想当然的思路就是从W[0]开始,对每个Q遍历判断有没有一样的,截取出第一个包含Q中元素的W[i]到最后一个包括Q中元素的W[j]。需要O(MN)次比较。

如果前提能够肯定W中包含所有的Q那就,先从W[0]开始找到第一个包含Q的,再从W[N-1]向前找第一个包含Q的。

上面的思路有问题,因为W中可能重复的包含了Q中的元素,我们找最短的是要W[i-j]中没有重复的Q元素

为了去掉重复的数字,就先找到一个全部包含Q的范围,然后去掉第一个元素,再找包含全部Q的范围,依次类推。记录下最短的范围。就是答案中的解法二。解法二的伪代码如下:

注意其中对头和尾分别使用了两个指针。

int nTargetLen = 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)
            {
                    nTargetLen = pEnd - pBegin;
                    nAbstractBegin = pBegin;
                    nAbstractEnd = pEnd - 1;
            }
            pBegin++;
      }
      if(pEnd >= N)
             Break;
}

  

自己还想了一种,就是先把W中所有与Q相同的都先记下来位置,然后用图的方法找经过所有节点的最小路径。但是由于解法二已经是O(MN)了,用图的话,光记录位置就要O(MN)划不来,就没做了。

时间: 2024-08-05 17:18:31

【编程之美】3.5 最短摘要的生成的相关文章

编程之美----最短摘要的生成

题意:假设给定的已经是经过网页分词之后的结果,词语序列数组为W.其中W[0], W[1], ... , W[N]为一些已经分好的词语.假设用户输入的搜索关键词为数组Q.其中Q[0], Q[1], ... Q[m]为所有输入的搜索关键词. 例如,我们可以看到这样一个序列: w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0,  w9, q1 解法思路: 第一次扫描时,假设包含所有关键词,将得到如下的结果(用 a 这种形式表示指向位置) w0, w1, w2

【编程之美】目录

第1章  游戏之乐——游戏中碰到的题目 1.1 让CPU占用率听你的指挥 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 1.4 买书问题 第2章  数字之魅——数字中的技巧 2.1 求二进制中1的个数 2.2 不要被阶乘吓倒 2.3 寻找发帖"水王" 2.4 1的数目 2.5 寻找最大的K个数 2.6 精确表达浮点数 2.7 最大公约数问题 2.8 找符合条件的整数 2.9 斐波那契(Fibonacci)数列 2.10 寻找数组中的最大值和最小值 2.11 寻找最近点对 2.12

编程之美之最短摘要生成

书上给出了最短摘要的描述即算法,简单来说就是: 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的range里包含所有关键字 .然后每次迭代,尝试调整pBegin和pEnd: 1.pBegin递增,直到range无法包含所有关键字 2.pEnd递增,直到range重新包含所有关键字 计算新的range,与旧的range相比,看是否缩短了,如果是,则更新 不考虑关键字的先后顺序 .这里给出最短摘要算法的几个应用,首先是leetcode上面的两题: M

编程之美-最短摘要

这个主要注意几点:首先,str[i]-str[j]包含keyword里面的所有词语,但是不要求顺序相同,然后,str[i]-str[j]是所有满足这样要求的最短子串. 主要方法是:deque<index> store: 记录当前摘要的所有单词在str中的下标,map<string, int> record记录所有当前摘要中出现的次数.min_len:当前最短摘要的长度.min_index_first:当前最短摘要的第一个词语在str中的下标,min_index_last:当前最短摘

最短摘要生成

题目: Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号: 再给定N个英文单词关键 字,请说明思路并编程实现方法String extractSummary(String description,String[] key words), 目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出.(不限编程语言)20分. 在网上看到一种用链表实现的方法,时间复杂度可以达到O(m+n).在这里实现一下. 分析

字符串----最短摘要生成

题目:Alibaba笔试题,给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号:再给定N个英文单词关键字,请说明思路并编程实现方法.String extractSummary(String description,String[] key words)目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出.(不限编程语言)20分. 思路一: 直接暴力解法,循环暴力破解,每次判断关键字是否全部包含,然后不断更新边界. 思路二:

编程之美-分层遍历二叉树

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <span style="font-size:14px;">1 2 3 4 5 6 7 8</span> 书中还给出了问题2:打印二叉树中的某层次的节点(从左到右),其中根结点为第0层,成功返回true,失败返回false 分析与解法 关于二叉树的问题,由于其本身固有的

读书问题之《编程之美》 -----12061161 赵梓皓

我阅读的书是<编程之美> 刚开始的时候阅读序,就觉得控制cpu利用率这个问题很好玩,所以重点看了这部分和解决办法,问题也都大部分是这部分的.那么问题就来了(挖掘机技术xxx?中国山东找蓝翔) 咳咳,问题在下面: 1.关于问题的提出.(也是一点点建议) 本书的主要内容是告诉读者如何思考问题和解决问题.但是提出问题也是很重要的,正如爱因斯坦所说“提出一个问题往往比解决一个问题更重要”,很多面试题(比如井盖为啥是圆的)我觉得正常人很少会想到.所以,这个问题是怎么想出来的...我很好奇.也希望作者能够

《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 为了防止剧透使得没看过原题目的读者丧失思考的乐趣,我把最好的解法隐藏起来.由于这个问题本身的解答并不是本文的重点,扩展问题也采用这种形式呈现. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/article/details/6447013,作者v_JULY_v. 用指针p1.p2分别指向两个链表头,不断后移:最后到达各自表尾时,若p1==p2,那么两个链表必相交 用