本文源自《编程之美》3.5 最短摘要生成一课。
题意:在一个字符串中,找一些目标字符串集合,找到包含所有目标字符串的最小连续子串。题目虽然叫做“最短摘要生成”,但和实际上的搜索snippet的计算还有较大差距。
解法:采用了“双指针”策略,其思想在很多算法设计中都有价值。思想是:开始两个指针都指向缓冲区头部,尾指针向后扫描,直到头指针和尾指针中间包含了全部的关键字;那么头指针向后移动,直到包含全部关键字的这个条件失败。这是截取字符串并和已取得的最小字符串比较,如果小则替换。
下面是我的代码
#include <iostream> #if 0 #include <hash_map.h> //因为hash_map暂不为cpp标准,所以没法<hash_map> #else #include <tr1/unordered_map> #define hash_map std::tr1::unordered_map #endif using namespace std; 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; } int main(){ char* w="abbbbbcaaadebmmmmdcfg"; int wLen=21; char* q="bd"; int qLen=2; findMinAbstract(w, wLen, q, qLen); return 0; }
效果:
相关推荐
线性表是最基本的数据结构之一,通过连续的内存位置或链式结构存储元素,支持增删查改操作。 **3.2 线性表的顺序存储与实现**:利用数组实现,访问速度快,但插入删除效率较低。 **3.3 线性表的链式存储与实现** ...
以上内容覆盖了软考中级数据库思维导图中提到的主要知识点,从计算机硬件到软件编程语言的基础,再到数据结构与算法等方面进行了详细介绍。这些知识点对于理解和掌握数据库管理及应用开发具有重要的意义。
在《数据结构与算法 JAVA 版》这本书中,第一章主要介绍了Java编程语言的基础知识以及其面向对象的特点。 - **1.1 Java语言基础知识** - **1.1.1 基本数据类型及运算**:这部分内容涵盖了Java中的基本数据类型,如...
- **Strategy接口**:解释策略模式的概念,并讨论其在Java编程中的应用。 ##### 3.2 线性表的顺序存储与实现 - 讨论顺序存储的原理、优点(如访问速度快)和缺点(如插入删除操作效率低)。 ##### 3.3 线性表的...
C3.5 程序员定义的异常类 232 第7章 实现ADT栈 235 7.1 基于数组的实现 236 7.2 基于链表的实现 239 7.3 在实现中使用异常 243 第8章 列表 247 8.1 指定ADT列表 248 8.2 使用列表操作 252 8.3 ADT列表的模板...
3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...
本章节介绍了栈与队列这两种特殊的数据结构,并对其在实际编程中的应用进行了详细的解析。 **4.1 栈** - **栈的定义及抽象数据类型** - 栈的概念与特点 - 栈的抽象数据类型定义 - **栈的顺序存储实现** - 顺序...
### 数据结构与算法 #### 一、Java与面向对象程序设计 **1.1 Java语言基础知识** ...以上知识点涵盖了从Java编程基础到高级数据结构和算法的全面内容,旨在帮助读者逐步掌握数据结构与算法的核心知识和技术。
- **第十四章:加权图**:重点讲解了最小生成树、最短路径等问题的求解算法。 - **第十五章:何时使用什么**:总结了不同场景下应选择哪种数据结构或算法的原则。 #### 四、附录 - **附录A**:提供了如何运行书中...