编程之美之最短摘要生成

来源:互联网 发布: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

 
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上一次出现的位置的下一个位置,每次向后移动一个字符,如果pos[i]>start,则更新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。只要返回第一个即可。



7 2
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一正常吃饭就胖怎么办 高铁盒饭没15的怎么办 上火车前票丢了怎么办 减肥期吃了汉堡怎么办 寿司店鳗鱼有刺怎么办 吃泡面胃难受该怎么办 吃上火的东西脸上长痘痘怎么办 减肥期间吃撑了怎么办 喝了变质的牛奶怎么办 绿豆糕吃多了会怎么办 小孩抓米饭烫了手怎么办 减肥不来月经了怎么办 吃了馊了的米饭怎么办 饭在冰箱里硬了怎么办 剩米饭反潮了怎么办 吃馊米饭中毒后怎么办? 蒸熟的米饭发黄怎么办 孕妇肉类吃的少怎么办 大米饭坏了吃了怎么办 米饭煮糊了锅怎么办 减肥吃了猪肉脯怎么办 吃了硬米饭胃痛怎么办 宝宝吃了硬物怎么办 米饭卡在喉咙里了怎么办 喉咙里卡了米饭怎么办 孕妇吃了坏鹅蛋怎么办 1岁大宝宝长短腿怎么办 行测中的判断推理怎么办 塑料盖子玻璃罐头瓶子打不开怎么办 猪肉烫火锅吃怎么办料 自制腊肠放干了怎么办 孕妇吃了4块腊肉怎么办 衣服沾了火锅味怎么办 皮包上有火锅味怎么办 芝士年糕裂开了怎么办 制作牛肉酱咸了怎么办 腌牛肉太咸了怎么办 八宝粥的拉环断了怎么办 八宝粥易拉罐拉环断了怎么办 吃完辣的胃难受怎么办 天天呆在家很烦怎么办