最短摘要

简介: 转自:http://blog.csdn.net/huangxy10/article/details/8087035 2011年题目: Alibaba笔试题: 给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。

转自:http://blog.csdn.net/huangxy10/article/details/8087035

2011年题目:

Alibaba笔试题:

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


人搜面试题:

 

1、求包含所有query的最短距离  

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

 

解答:

 

这道笔试题和编程之美最短摘要生成的方法类似,先来看看这些序列:

w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1

     问题在于,如何一次把所有的关键词都扫描到,并且不遗漏。扫描肯定是无法避免的,但是如何把两次扫描的结果联系起来呢?这是一个值得考虑的问题。

     沿用前面的扫描方法,再来看看。第一次扫描的时候,假设需要包含所有的关键词,从第一个位置w0处将扫描到w6处:

w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1

     那么,下次扫描应该怎么办呢?先把第一个被扫描的位置挪到q0处。

w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1

     然后把第一个被扫描的位置继续往后面移动一格,这样包含的序列中将减少了关键词q0。那么,我们便可以把第二个扫描位置往后移,这样就可以找到下一个包含所有关键词的序列。即从w4扫描到w9处,便包含了q1,q0:

w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1

     这样,问题就和第一次扫描时碰到的情况一样了。依次扫描下去,在w中找出所有包含q的序列,并且找出其中的最小值,就可得到最终的结果。

 

 

 

    1. #include <iostream>  
    2. #include <vector>  
    3. #include <string>  
    4. #include <set>  
    5. using namespace std;  
    6.   
    7. bool FindShortestAbstract( const vector<string> & doc, const set<string> & query, int &a, int &b){  
    8.     set<string> notFind(query.begin(), query.end());  
    9.     a=0;b=0;  
    10.     int i=0,j=0;  
    11.     int shortest=0;  
    12.     int len= doc.size();  
    13.     while( i<len&&j<len ){  
    14.         set<string>::iterator it = notFind.find( doc[j++] );  
    15.         if( it!=notFind.end()) {             //如果找到了,则删除  
    16.             notFind.erase( it  );  
    17.         }  
    18.         if( notFind.empty() ){                //如果全部找到  
    19.             while( query.find(doc[i++])==query.end() ); //寻找第一个出现的query  
    20.             if( i>0 ){  
    21.                 notFind.insert( doc[i-1] );  
    22.                 if( shortest>j-i||shortest==0 )  
    23.                     shortest = j-i;        //记录最小距离  
    24.                     a=i-1;b=j-1;  
    25.             }  
    26.         }  
    27.     }  
    28.     if( shortest==0 )  
    29.         return false;  
    30.     return true;  
    31. }  
    32.   
    33. int main(){  
    34.     string doc[]={"I""love""you""and""me""do""you""like" , "me"};  
    35.     string query[]={ "you""like""me"};  
    36.     vector<string> d(doc,doc+sizeof(doc)/sizeof(string));  
    37.     set<string> q(query, query+sizeof(query)/sizeof(string));  
    38.     int a=0,b=0;  
    39.     FindShortestAbstract( d,q,a,b);  
    40.     cout <<a<<endl<<b<<endl;  
    41.     return 0;  

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
1天前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
139 1
|
7天前
|
存储 算法
力扣经典150题第四十六题:最长连续序列
力扣经典150题第四十六题:最长连续序列
5 0
|
2月前
|
算法
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。
|
2月前
【错题集-编程题】包含不超过两种字符的最长字串(滑动窗口)
【错题集-编程题】包含不超过两种字符的最长字串(滑动窗口)
|
9月前
|
算法 测试技术 C++
C++算法:朴素迪氏最短单源路径的原理及实现
C++算法:朴素迪氏最短单源路径的原理及实现
Leecode1124表现良好的最长时间段
Leecode1124表现良好的最长时间段
32 0
LeetCode 1869. 哪种连续子字符串更长
给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
57 0
【读者来稿】在一串长序列中查找特定短序列
【读者来稿】在一串长序列中查找特定短序列
79 0
7-46 最长对称子串 (25 分)
7-46 最长对称子串 (25 分)
95 0
|
算法
重温算法之最长连续序列
连续序列系列的题目也很多,我大概看了一下,解决方案里动态规划用得很多还有就是借助哈希表去实现,只能说题友们的思路真的很好,还有就是也应该尝试一下写出最优解。
131 0
重温算法之最长连续序列

热门文章

最新文章