这块硬骨头,放在这里半年的时间了,一直没有动,今天周末看看,书上把过程写的比较详细,自己基本也看懂了,但是对代码本身的编写还是比较生疏,要经常复习,估计才能看透,后面有看了kmp;这两者之间的关系也是头大。。。

  1. /*!
  2. * \file MP_算法.cpp
  3. *
  4. * \author ranjiewen
  5. * \date 2017/02/12 15:06
  6. *
  7. *
  8. */
  9.  
  10. void preMp(const char *pattern, int m, int mpNext[]) //m为pattern的长度
  11. {
  12. int i, j;
  13. i = ;
  14. j = mpNext[] = -;
  15. while (i<m)
  16. {
  17. while (j>-&&pattern[i]!=pattern[j]) //
  18. {
  19. j = mpNext[j];
  20. }
  21. mpNext[++i] = ++j; //mpNext(j)=f(j-1)+1
  22. }
  23. }
  24.  
  25. #include <iostream>
  26. #include <string>
  27. using namespace std;
  28.  
  29. void MP(string pattern, string target)
  30. {
  31. int m = pattern.length();
  32. int n = target.length();
  33. if (m>n)
  34. {
  35. cerr << "Unsuccessful match!" << endl;
  36. return;
  37. }
  38. const char* x = pattern.c_str();
  39. const char* y = target.c_str();
  40. int i = , j = , mpNext[]; //m+1大小
  41.  
  42. preMp(x, m, mpNext); //mpNext 进行一下轮比较过程中模式P的起始比较位置
  43.  
  44. bool flag = false;
  45. while (i<n) //i 遍历target字符串
  46. {
  47. while (j>-&&x[j]!=y[i]) //j 匹配模式字符串
  48. {
  49. j = mpNext[j];
  50. }
  51. j++;
  52. i++;
  53.  
  54. if (j>=m)
  55. {
  56. cout << "Matching index found at:" << i - j << endl;
  57. j = mpNext[j]; //匹配后面的子串
  58. flag = true;
  59. }
  60. }
  61. if (!flag)
  62. {
  63. cout << "Unsuccessful match=-====!";
  64. }
  65. }
  66.  
  67. int main(int argc, char** argv)
  68. {
  69. string p1 = "abcabcad";
  70. string p2 = "adcadcad";
  71. string p3 = "ababcaabc";
  72. string t = "ctcabcabcadtcaabcabcaaatabcabcad";
  73.  
  74. cout << "MP_p1 : " << endl;
  75. MP(p1, t);
  76. cout << endl;
  77.  
  78. cout << "MP_p2 : " << endl;
  79. MP(p2, t);
  80. cout << endl;
  81.  
  82. cout << "MP_p3 : " << endl;
  83. MP(p3, t);
  84. cout << endl;
  85.  
  86. string t1 = "ctcaatcacaatcat";
  87. string p4 = "caatcat";
  88. MP(p4, t1);
  89. cout << endl;
  90. return ;
  91. }

算法之美--3.2.2 MP算法的更多相关文章

  1. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  2. 算法之美--3.2.3 KMP算法

    不知道看了几遍的kmp,反正到现在都没有弄清楚next[j]的计算和kmp的代码实现,温故而知新,经常回来看看,相信慢慢的就回了 从头到尾彻底理解KMP 理解KMP /*! * \file KMP_算 ...

  3. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  4. JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  5. JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  6. JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?

    1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...

  7. 【EatBook】-NO.2.EatBook.2.JavaArchitecture.1.001-《修炼Java开发技术在架构中体验设计模式和算法之美》-

    1.0.0 Summary Tittle:[EatBook]-NO.2.EatBook.2.JavaArchitecture.1.001-<修炼Java开发技术在架构中体验设计模式和算法之美&g ...

  8. MP算法、OMP算法及其在人脸识别的应用

    主要内容: 1.MP算法 2.OMP算法 3.OMP算法的matlab实现 4.OMP在压缩感知和人脸识别的应用 一.MP(Matching Pursuits)与OMP(Orthogonal Matc ...

  9. 推荐学习《算法之美:指导工作与生活的算法》中文PDF+英文PDF

    我们所有人的生活都受到有限空间和有限时间的限制,因此常常面临一系列难以抉择的问题.在一天或者一生的时光里,哪些事是我们应该做的,哪些是应该放弃的?我们对杂乱无序的容忍底线是什么?新的活动与熟悉并喜爱的 ...

随机推荐

  1. 【MySQL】MySQL备份和恢复

    一.为什么要备份数据 在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大概分为以下几种. 硬件故障 软件故障 自然灾害 黑客攻击 误操作 (占比最大) 所以, 为了在数据丢失之后能够 ...

  2. java事物

    [引用:http://www.cnblogs.com/kristain/articles/2038397.html] 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数 ...

  3. luogu4173 残缺的字符串

    there #include <algorithm> #include <iostream> #include <cstring> #include <cst ...

  4. SDOJ 3742 黑白图

    [描述] 一个 n 个点 m 条边构成的无向带权图.由一些黑点与白点构成 树现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个,可以选 取其中任意一个),我们想要使得花费的代价最小.请问这 ...

  5. GloVe词分布式表示

    GloVe 模型介绍 下面的内容主要来自https://blog.csdn.net/u014665013/article/details/79642083 GloVe的推导 GloVe是基于共现信息来 ...

  6. kb-07线段树-03--区间修改查询--lazy思想

    /* 区间修改,区间查询和: 第一次使用lazy思想: poj3468 */ #include<iostream> #include<cstdio> #include<c ...

  7. BZOJ 3489 A simple rmq problem ——KD-Tree

    考前写写板子. 用$(i,pre[i],nxt[i])$来描述一个点,然后就变成了区间求最值的问题. KD-Tree 由低维转向高维的方法,可以用来敲暴力. 剩下就是KD-Tree的基本操作了. #i ...

  8. BZOJ3209 花神的数论题 【组合数 + 按位计数】

    题目 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC -- 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有超级难的神题啦-- 我等蒟蒻又遭殃了. 花神的题目 ...

  9. 学习的一些mybatis

    MyBatis入门基础(一) 阅读目录 一:对原生态JDBC问题的总结 二:MyBatis框架 三:mybatis入门程序 四:mybatis和Hibernate的本质区别与应用场景 五:小结 回到顶 ...

  10. linux监控平台搭建-内存

    linux监控平台搭建-内存 上一篇文章说的硬盘.就写一下.更加重要的东西.在手机上面是RAM.机器是memory.内存是按照字节编址.每个地址的存储单元可以存放8bit的数据.cpu 通过内存地址获 ...