最短摘要的生成

来源:互联网 发布:启明软件股份有限公司 编辑:程序博客网 时间:2024/05/18 05:12

《编程之美》第3.5节:最短摘要的生成

题目:假设给定的已经是经过网页分词之后的结果,词语序列数组为T。假设用户输入的搜索关键词为数组S。这样生成的最短摘要实际上就是一串相互联系的分词序列。

解法:遍历一遍输入序列T,将T中与S字符相同的字符的下标放入数组中,然后从这个数组中不断读出单词,放入集合ses中,当ses的大小等于S.size()时,说明已经找到一个短的摘要了,更新length。如果已经遍历了length个单词,让然没有找到,就放弃当前遍历,因为即使后面找到了,长度也不可能比length小了。

代码:

#include<iostream>#include<string>#include<vector>#include<queue>#include<set>using namespace std;//返回最短摘要[begin,end)注意是左闭右开的区间pair<int,int> generateAbstract(vector<string> &T,vector<string> &S){int length=INT_MAX;int begin=0,end=0;vector<int> candidate;for(size_t i=0;i<T.size();i++){if(find(S.begin(),S.end(),T[i])!=S.end())candidate.push_back(i);}for(size_t i=0;i<candidate.size();i++){set<string> ses;for(int j=i;j<candidate.size();j++){ses.insert(T[candidate[j]]);if(length<candidate[j]-candidate[i]+1)//如果到当前为止,已经超过了最小长度的范围,则肯定要排除continue;if(ses.size()==S.size() && length>candidate[j]-candidate[i]+1){begin=candidate[i];end=candidate[j]+1;length=end-begin+1;}}}return pair<int,int>(begin,end);}int main(){vector<string> T;vector<string> S;freopen("input.txt","r",stdin);string inputString;while(cin>>inputString)T.push_back(inputString);cin.clear();freopen("inputS.txt","r",stdin);while(cin>>inputString)S.push_back(inputString);fclose(stdin);freopen("CON", "r", stdin);cout<<cin.eof()<<endl;cin.clear();//注意这里要用clear把cin.eof位清除掉cout<<cin.eof()<<endl;//cin.sync();pair<int,int> result=generateAbstract(T,S);for(int i=result.first;i<result.second;i++)cout<<T[i];cout<<endl;system("pause");return 0;}
输入序列:input.txt

微软 亚洲 研究院 成立 于 1998 年 , 我们 的 使命 是 使 未来 的 计算机 能够 看 、 听 、 学 , 能 用 自然语言 与 人类 进行 交流 
。 在 此 基础 上 , 微软 亚洲 研究院 还 将 促进 计算机 在 亚太 地区 的 普及 , 改善 亚太 用户 的 计算 体验

inputS.txt:

微软 亚洲 研究院 使命

0 0
原创粉丝点击