KMP算法的C++实现
这个问题阮一峰老师讲的很清楚,链接
这里我只贴一下我的C++实现代码:
#include <iostream> #include <cstring> #include <string> #include <set> #include <map> using namespace std;void BuildPatchMatchTable(int *partMatchTable, char *findstr) {if(findstr == NULL)return;partMatchTable[0] = 0;int sizefind = strlen(findstr);for(int i = 1; i < sizefind; ++i){set<string> preset;string tmppre = "";tmppre = findstr[0];preset.insert(tmppre);for(int j = 1; j < i; ++j){tmppre = tmppre + findstr[j];preset.insert(tmppre);}set<string> postset;string tmppost = "";tmppost = findstr[i];postset.insert(tmppost);for(int j = i - 1; j > 0; --j){tmppost = findstr[j] + tmppost;postset.insert(tmppost);}set<string> comset;for(set<string>::iterator beg = preset.begin(); beg != preset.end(); ++beg){if(postset.count(*beg) > 0)comset.insert(*beg);}int maxlen = 0;for(set<string>::iterator beg = comset.begin(); beg != comset.end(); ++beg){if((*beg).size() > maxlen)maxlen = (*beg).size();}partMatchTable[i] = maxlen;} } int kmp(char *srcstr, char *findstr) {if(srcstr == NULL || findstr == NULL)return -1;int lensrc = strlen(srcstr);int lenfind = strlen(findstr);int *partMatchTable = new int[lenfind];BuildPatchMatchTable(partMatchTable, findstr);for(int i = 0; i < lenfind; ++i)cout << findstr[i] << "\t" << partMatchTable[i] << endl;int curFind = 0;for(int i = 0; i < lensrc; ){if(findstr[curFind] == srcstr[i]){++i;++curFind;}else{if(curFind == 0)++i;else{int movestep = curFind - partMatchTable[curFind-1];i += movestep;curFind = 0;}}if(curFind == lenfind){delete []partMatchTable;return i - lenfind;}}return -1;delete []partMatchTable; } int main() {char srcStr[] = "bbc abcdab abcdabcdabde";char findStr[] = "abcdabd";cout << "pos:" << kmp(srcStr, findStr) << endl;char srcStr2[] = "bbc abcdab abcdabcdabdezzz";char findStr2[] = "zzz";cout << "pos:" << kmp(srcStr2, findStr2) << endl;char srcStr3[] = "bbc abcdab abcdabcdabde";char findStr3[] = "zzz";cout << "pos:" << kmp(srcStr3, findStr3) << endl; }
关键问题
1. 求出部分匹配值表
2. 移动次数= 已匹配个数 - 最后一个匹配的字符的部分匹配结果
转载于:https://www.cnblogs.com/kaituorensheng/p/3633700.html
KMP算法的C++实现相关推荐
- BF算法优化-------KMP算法
百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...
- 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...
- hiho 1015 KMP算法 CF 625 B. War of the Corporations
#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- HDU 1711 Number Sequence(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...
- 算法(2)KMP算法
1.0 问题描述 实现KMP算法查找字符串. 2.0 问题分析 "KMP算法"是对字符串查找"简单算法"的优化. 字符串查找"简单算法"是源 ...
- KMP算法求回溯数组的步骤
KMP算法到底是什么原理就不说了,各种资料上讲的明明白白,下面我就如何用代码来实现做一下说明和记录. KMP的核心思想就是,主串不回溯,只模式串回溯.而模式串匹配到第几位时失配,要回溯多少,由模式串本 ...
- 【HDU】2087 剪花布条 (KMP算法的应用)
可以参考:从头彻尾彻底理解KMP 可以用朴素的模式匹配算法,也可以使用KMP算法,KMP算法所用的时间较短 普通版 #include <iostream> #include <str ...
- 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)
字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...
- 【每日一算法】KMP算法,看不懂算我输!
微信改版,加星标不迷路! 每日一算法-KMP算法详解 作者:poll的笔记 阅读目录 1 字符串匹配 2 KMP算法 1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有 ...
- 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)
目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...
最新文章
- Mac下Homebrew的图形化界面工具Cakebrew
- boost::system::error_category相关的测试程序
- C# WinForm程序退出的方法比较
- 一款 APK 是怎么诞生的?
- basys2数码管共阳还是共阴_数据选择器Multiplexer || 数码管动态显示 ||实现逻辑函数 || 重难考点 || 数电...
- [vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢?
- 拼写校正与动态规划的小故事
- c语言sort_C语言十大排序算法,让老师对你刮目相看的技巧
- 博客系统如何随机插入大量文章数据
- php如何反向排列数组,php中的sort()如何排列目录结构数组?
- 暗影精灵5学计算机够用吗,为什么说暗影精灵5值得买?拆客给你看本!
- 使用Kalibr进行IMU+相机的标定
- 排序构造 GYM 101149 F - The Weakest Sith
- 塔科夫服务器修改器,逃离塔科夫修改器+15项
- 【自走棋】地图格子高亮效果
- 数据分析报告2:Superstore销售情况分析
- 微信开发者工作遇到的ERROR
- 在 csproj 文件中使用系统环境变量的值(示例将 dll 生成到 AppData 目录下)
- Java知识点串讲之面向对象简述
- 联想电脑亮度无法调节,蓝牙无法连接
热门文章
- css背景图毛玻璃,css实现背景图片的毛玻璃效果
- “技术需求”与“技术成果”项目之间关联度计算模型top1
- android multipartentity 怎么上传参数,android-通过MultipartEntityBuilder通过HTTP表单上传文件,并显示进度b...
- mysql日志文件架构_mysql日志文件
- 画一个圆角多边形_用SolidWorks一个扫描画出这个多边形瓶子
- 查询很慢会导致锁表吗_MySQL的insert into select 引发锁表
- 读书笔记∣世界是数字的
- Win 7 下IE 的cookie 以及 Favorites 地址
- Web容器初始化过程
- vs2008与oracle数据库连接