编程之美-最短摘要的生成 - 代码物语-Let code talk - ITeye技术网站
包含所有关键字(关键字不要求按用户输入的顺序排列)的长度最短的摘要.
在一个字符串中,找一些目标字符串集合,找到包含所有目标字符串的最小连续子串.
http://chuanwang66.iteye.com/blog/1836718
http://blog.csdn.net/v_july_v/article/details/6890054
Read full article from 编程之美-最短摘要的生成 - 代码物语-Let code talk - ITeye技术网站
包含所有关键字(关键字不要求按用户输入的顺序排列)的长度最短的摘要.
在一个字符串中,找一些目标字符串集合,找到包含所有目标字符串的最小连续子串.
http://chuanwang66.iteye.com/blog/1836718
- void findMinAbstract(char* w, int wLen, char* q, int qLen){
- //[begin, end]双指针
- int begin=0;
- int end=-1;
- //最短摘要
- int minLen=wLen+1; //最短摘要长度
- int minBegin; //最短摘要开始
- int minEnd; //最短摘要结束
- hash_map<char, bool> qHashMap; //需要找的关键字
- for(int i=0;i<qLen;i++){
- qHashMap[q[i]]=true;
- }
- hash_map<char, int> qFoundCnt; //统计找到关键字的次数
- int qFoundNum=0; //已经找到的关键字个数
- while(true){
- //在当前状态[begin, end]: 还没找到所有关键字 ,后指针后移
- while(qFoundNum<qLen && end<=wLen-1){
- end++;
- if(qHashMap[w[end]]==true){//找到关键字
- if(qFoundCnt[w[end]]==0){//以前找到过
- qFoundCnt[w[end]]=1;
- qFoundNum++;
- }else{ //以前未找到过
- qFoundCnt[w[end]]++;
- }
- }
- }
- //在当前状态[begin, end]: 已经找到所有关键字,前指针后移
- while(qFoundNum==qLen && begin<=end){
- if(end-begin+1<minLen){
- minLen=end-begin+1;
- minBegin=begin;
- minEnd=end;
- }
- //前指针后移:去掉 w[begin]
- if(qHashMap[w[begin]]==true){
- if(qFoundCnt[w[begin]]>1){
- qFoundCnt[w[begin]]--;
- }else if(qFoundCnt[w[begin]]==1){
- qFoundCnt[w[begin]]=0;
- qFoundNum--;
- }
- }
- begin++;
- }
- if(end>=wLen)
- break;
- }
- //显示最短摘要
- for(int i=0;i<wLen;i++){
- cout<<w[i];
- }cout<<endl;
- for(int i=0;i<wLen;i++){
- if(i==minBegin){
- cout<<"b";
- }else if(i==minEnd){
- cout<<"e";
- }else{
- cout<<" ";
- }
- }cout<<endl;
- cout<<"minLen = "<<minLen<<endl;
- }
http://blog.csdn.net/v_july_v/article/details/6890054
Read full article from 编程之美-最短摘要的生成 - 代码物语-Let code talk - ITeye技术网站