编程之美之最短摘要生成

书上给出了最短摘要的描述即算法,简单来说就是:

扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的range里包含所有关键字 。然后每次迭代,尝试调整pBegin和pEnd:

1.pBegin递增,直到range无法包含所有关键字

2.pEnd递增,直到range重新包含所有关键字

计算新的range,与旧的range相比,看是否缩短了,如果是,则更新 不考虑关键字的先后顺序 。这里给出最短摘要算法的几个应用,首先是leetcode上面的两题:

Minimum Window Substring

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,

S = "ADOBECODEBANC"

T = "ABC"

Minimum window is "BANC".

Note:

If there is no such window in S that covers all characters in T, return the emtpy string "".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

思路:和最短摘要类似,只是编程之美中没有给出具体的实现。这里使用了两个数组,一个是摘要的字符的个数,一个是当前找到的摘要的个数。当找到

完整的摘要时,就开始移动窗口左端的指针,算法和编程之美中的一样

class Solution {
public:
    string minWindow(string S, string T) {
    	int needChar[256] = {0},findChar[256] = {0},i,sLen = S.size(),tLen = T.size();
    	for(i = 0; i < tLen; ++i) ++needChar[T[i]];
    	int begin = 0 , end = 0 , minWindowSize = INT_MAX , windowLeft = 0,windowRight = 0 , count = 0;
    	for(; end < sLen ;++end )
    	{
    		if(needChar[S[end]] == 0)continue;
    		if(++findChar[S[end]] <= needChar[S[end]])++count;
    		if(count == tLen)//找到一个完整的摘要
    		{
    			while(begin <= end)
    			{
    				if(needChar[S[begin]] == 0)
    				{
    					++begin;
    					continue;
    				}
    				if(findChar[S[begin]] > needChar[S[begin]])//尽可能的移动窗口的左指针
    				{
    					--findChar[S[begin++]];
    					continue;
    				}
    				else break;//此时,左窗口指针已不能移动
    			}
    			if(end - begin + 1 < minWindowSize)//更新当前窗口的大小
    			{
    				minWindowSize = end - begin + 1;
    				windowLeft = begin;
    			}
    		}
    	}
    	if(minWindowSize == INT_MAX)return "";
        return S.substr(windowLeft,minWindowSize);
    }

};

Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring
is "b", with the length of 1.

思路:start指向当前不存在重复的字符的开始位置,pos[i]表示字符i的最大位置,每次向后移动一个字符,如果存在重复字符,则更新start

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    	int start = 0 , end = 0 , maxLength = 0;
    	int pos[256] = {0};
    	for(;end < s.size();++end)
    	{
    		if(pos[s[end]] > start)start = pos[s[end]];//即s[end]在前面已经出现错,为了没有重复,start指向上次s[end]出现的下一个位置
    		if(end - start + 1 > maxLength)maxLength = end - start + 1;
    		pos[s[end]] = end + 1;//记录s[end]出现的下一个位置
    	}
    	return maxLength;
    }
};

笔试题:

1、阿里巴巴2011年

给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。

2、人人面试题

求包含所有query的最短距离

一篇文章,切完词之后放到一个vector<string>中,一个查询切完词也放到一个vector<string>中,写一个函数找出这篇文章中包含这个查询中所有词的最小区间的i和j。只要返回第一个即可。

编程之美之最短摘要生成

时间: 2024-10-27 07:18:08

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

最短摘要生成

题目: 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分. 思路一: 直接暴力解法,循环暴力破解,每次判断关键字是否全部包含,然后不断更新边界. 思路二:

编程之美-最短摘要

这个主要注意几点:首先,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:当前最短摘

【编程之美】目录

第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

《编程之美-读书笔记》-1 中国象棋将帅问题

时间:2014.05.27 地点:基地 ---------------------------------------------------------------------------------------- 一.指针和引用的区别 1.指针可以为空,引用不可以不空. 引用是一个对象的别用,定义一个引用时必须初始化,而声名指针时可以不指向任何对象,故使用指针时也常要做空的判断,而引用无需,因为引用总是绑定着一个对象. 2.指针可以改变指向,而引用不可以重新绑定新对象.(指针变异思迁,引用从

编程之美-求二进制1的个数

一个在常见的题目,但是看到编程之美的时候才发现,方法真多,今天来总结一下: 解法一 可以举出一个八位的二进制例子来进行分析.对于一个二进制操作,我们知道,除以一个2,原来的数字将会减少一个0,如果除的过程中有余,那么就表示当前位置有一个1. 以10 100 010为例: 第一次除以2时,商为 1 010 001,余为 0. 第二次除以2时,商为 101 000,余为1. 因此可以根据整型除法的特点求解,代码如下: public int countBit1(int n) { int num = 0

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

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <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,那么两个链表必相交 用