參考:从头到尾彻底理解KMP

在字符串 str 中 匹配模式串 pattern

1. 计算模式串的 next 数组;

2. 在字符串中匹配模式串;当一个字符匹配时,str[i++], pattern[k++] 继续匹配下一个字符;当当前字符不匹配时。依据 next 数组移动模式字符串。k = next[k]

next 数组:描写叙述模式串中最长同样的前缀和后缀的长度。

  1. #include <iostream>
  2. using namespace std;
  3. class Solution {
  4. public:
  5. void GetNext(string pattern) {
  6. next = new int[pattern.size()];
  7. next[0] = -1;
  8. int k = -1;
  9. int j = 0;
  10. while (j < pattern.size()-1) {
  11. if (k == -1 || pattern[j] == pattern[k]) {
  12. ++j;
  13. ++k;
  14. if (pattern[j] != pattern[k]) {
  15. // 此时的 pattern[k] 即为 pattern[next[j] ]
  16. next[j] =k;
  17. } else {
  18. // 假设 pattern[j] == pattern[next[j]]。则 k = next[k]
  19. next[j] = next[k];
  20. }
  21. } else {
  22. k = next[k]; // 不匹配。向前找前缀。相当于用模式串匹配模式串
  23. }
  24. }
  25. }
  26. int KMPSearch(string str, string pattern) {
  27. if (str.size() == 0 || pattern.size() == 0)
  28. return -1;
  29. GetNext(pattern);
  30. int j = 0; // 待匹配串索引
  31. int k = 0; // 模式串索引
  32. while (j < str.size() && k < (int)pattern.size()) { //注意,负数不能和 size_t 的无符号数作比較
  33. if (k == -1 || str[j] == pattern[k]) {
  34. ++k;
  35. ++j;
  36. } else {
  37. k = next[k]; // 不匹配,移动模式串
  38. }
  39. }
  40. if (k == pattern.size())
  41. return j-k;
  42. else
  43. return -1;
  44. }
  45. Solution() {
  46. next = NULL;
  47. }
  48. ~Solution() {
  49. if (next != NULL)
  50. delete []next;
  51. next = NULL;
  52. }
  53. private:
  54. int *next;
  55. };
  56. int main()
  57. {
  58. string str = "abacababc";
  59. string pattern = "abab";
  60. Solution sol;
  61. cout << sol.KMPSearch(str, pattern) << endl;
  62. }

相关:

Implement strStr() | 实现字符串查找函数: 用 hash-code 的方法实现字符串的搜索;easy实现,须要支持大数。

字符串匹配的Boyer-Moore算法:思路简单,性能更好,但不easy计算得到好后缀表和坏字符表

字符串匹配:KMP的更多相关文章

  1. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  2. 字符串匹配-KMP

    节选自 https://www.cnblogs.com/zhangtianq/p/5839909.html 字符串匹配 KMP O(m+n) O原来的暴力算法 当不匹配的时候 尽管之前文本串和模式串已 ...

  3. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  4. 字符串匹配KMP算法

    1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP

  5. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  6. 字符串匹配KMP算法的C语言实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  7. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  8. 字符串匹配KMP算法(转自阮一峰)

    转自 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...

  9. 【Foreign】字符串匹配 [KMP]

    字符串匹配 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 3 3 6 3 1 2 1 2 ...

  10. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

随机推荐

  1. Matplotlib 画廊

    https://matplotlib.org/gallery.html

  2. jQuery基本操作以及与js的一些比较

    jQuery和js主要区别在DOM操作 用jQuery必须先引进jQuery.js文件 js和jQuery写在哪: 1.标签里面 常用就是方法调用 2.写在script标签里面 3.js文件 dom操 ...

  3. BZOJ 5104 Fib数列(二次剩余+BSGS)

    斐波那契数列的通项: \[\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})-(\frac{1-\sqrt{5}}{2}))\] 设T=\(\sqrt{5}*N\),\ ...

  4. luogu P1592 互质(欧拉函数)

    题意 (n<=106,k<=108) 题解 一开始以为是搜索. 但想想不对,翻了一眼题解发现是欧拉函数. 因为 gcd(a,b)=gcd(a,a+b) 所以和n互质的数应该是类似a1,a2 ...

  5. react添加右键点击事件

    1.在HTML里面支持contextmenu事件(右键事件).所以需要在组建加载完时添加此事件,销毁组建时移除此事件. 2. 需要增加一个state,名称为visible,用来控制菜单是否显示.在_h ...

  6. grep的使用【转】

    grep的作用是显示匹配一个或多个模式的文本行.时常会作为管道(|)的第一步,以便对匹配的数据作进一步处理.grep常用于查找和替换文本的.在传统上,grep有3个版本:grep.egrep(扩展gr ...

  7. 传纸条 NOIP2008 洛谷1006 二维dp

    二维dp 扯淡 一道比较基本的入门难度的二维dp,类似于那道方格取数,不过走过一次的点下次不能再走(看提交记录里面好像走过一次的加一次a[i][j]的也AC了,,),我记得当年那道方格取数死活听不懂, ...

  8. YII显示sql进行调试

    进行插入測试: 一个简单控制器: function actionJia(){ $goods_model = new Goods(); //进行加入有别于查询不能使用以下这样的方式 // $goods_ ...

  9. 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

    [POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

  10. new,malloc,GlobalAlloc具体解释

    WINDOWS下最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是栈,而是直接在进程的地址空间中保留一快内存.尽管用起来最不方便. 可是速度快,也最灵活 new,malloc,Glob ...