编程之美之最短摘要生成
来源:互联网 发布:visio数据库图标在哪 编辑:程序博客网 时间:2024/05/01 10:55
书上给出了最短摘要的描述即算法,简单来说就是:
扫描过程始终保持一个[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
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。只要返回第一个即可。
- 编程之美 最短摘要生成
- 编程之美之最短摘要生成的困惑
- 编程之美之最短摘要生成
- 编程之美--3.5最短摘要生成
- 编程之美--3.5最短摘要生成
- 编程之美--最短摘要的生成
- 编程之美——最短摘要的生成
- 编程之美读书笔记--3.5 最短摘要的生成
- 编程之美--3.5最短摘要的生成
- 编程之美--最短摘要的生成
- 最短摘要的生成(编程之美)
- 编程之美-3.5最短摘要的生成
- 编程之美----3.5最短摘要的生成
- 《编程之美》——最短摘要的生成
- 编程之美-最短摘要的生成方法整理
- 编程之美读书笔记-最短摘要的生成
- 编程之美-最短摘要
- 编程之美-最短摘要
- linux C复习:文件操作(偏移量)
- android repo学习
- Audacity架构-PortAudio和wxWidgets
- 大盘分析
- LINUX基本操作
- 编程之美之最短摘要生成
- druid简单教程
- extjs学习01——开篇:extjs资料集锦
- 修改MyEclipse or Eclipse的启动画面
- Android学习记录:Acitivity
- LeetCode | Best Time to Buy and Sell Stock(股票购买和抛售问题)
- android:handle.postDelayed 与 removeCallbacks 用法
- 【索引】Volume 3. Brute Force
- 从SVN检出的项目出错(Target runtime Apache Tomcat v5.0 is not defined 错误解决方法)