这个问题阮一峰老师讲的很清楚,链接

这里我只贴一下我的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++实现相关推荐

  1. BF算法优化-------KMP算法

    百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...

  2. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  3. hiho 1015 KMP算法 CF 625 B. War of the Corporations

    #1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  4. HDU 1711 Number Sequence(KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...

  5. 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串. 2.0 问题分析 "KMP算法"是对字符串查找"简单算法"的优化. 字符串查找"简单算法"是源 ...

  6. KMP算法求回溯数组的步骤

    KMP算法到底是什么原理就不说了,各种资料上讲的明明白白,下面我就如何用代码来实现做一下说明和记录. KMP的核心思想就是,主串不回溯,只模式串回溯.而模式串匹配到第几位时失配,要回溯多少,由模式串本 ...

  7. 【HDU】2087 剪花布条 (KMP算法的应用)

    可以参考:从头彻尾彻底理解KMP 可以用朴素的模式匹配算法,也可以使用KMP算法,KMP算法所用的时间较短 普通版 #include <iostream> #include <str ...

  8. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

  9. 【每日一算法】KMP算法,看不懂算我输!

    微信改版,加星标不迷路! 每日一算法-KMP算法详解 作者:poll的笔记 阅读目录 1 字符串匹配 2 KMP算法 1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有 ...

  10. 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)

    目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...

最新文章

  1. Mac下Homebrew的图形化界面工具Cakebrew
  2. boost::system::error_category相关的测试程序
  3. C# WinForm程序退出的方法比较
  4. 一款 APK 是怎么诞生的?
  5. basys2数码管共阳还是共阴_数据选择器Multiplexer || 数码管动态显示 ||实现逻辑函数 || 重难考点 || 数电...
  6. [vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢?
  7. 拼写校正与动态规划的小故事
  8. c语言sort_C语言十大排序算法,让老师对你刮目相看的技巧
  9. 博客系统如何随机插入大量文章数据
  10. php如何反向排列数组,php中的sort()如何排列目录结构数组?
  11. 暗影精灵5学计算机够用吗,为什么说暗影精灵5值得买?拆客给你看本!
  12. 使用Kalibr进行IMU+相机的标定
  13. 排序构造 GYM 101149 F - The Weakest Sith
  14. 塔科夫服务器修改器,逃离塔科夫修改器+15项
  15. 【自走棋】地图格子高亮效果
  16. 数据分析报告2:Superstore销售情况分析
  17. 微信开发者工作遇到的ERROR
  18. 在 csproj 文件中使用系统环境变量的值(示例将 dll 生成到 AppData 目录下)
  19. Java知识点串讲之面向对象简述
  20. 联想电脑亮度无法调节,蓝牙无法连接

热门文章

  1. css背景图毛玻璃,css实现背景图片的毛玻璃效果
  2. “技术需求”与“技术成果”项目之间关联度计算模型top1
  3. android multipartentity 怎么上传参数,android-通过MultipartEntityBuilder通过HTTP表单上传文件,并显示进度b...
  4. mysql日志文件架构_mysql日志文件
  5. 画一个圆角多边形_用SolidWorks一个扫描画出这个多边形瓶子
  6. 查询很慢会导致锁表吗_MySQL的insert into select 引发锁表
  7. 读书笔记∣世界是数字的
  8. Win 7 下IE 的cookie 以及 Favorites 地址
  9. Web容器初始化过程
  10. vs2008与oracle数据库连接