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

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

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

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

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

#include <iostream>
using namespace std; class Solution {
public:
void GetNext(string pattern) {
next = new int[pattern.size()];
next[0] = -1;
int k = -1;
int j = 0;
while (j < pattern.size()-1) {
if (k == -1 || pattern[j] == pattern[k]) {
++j;
++k;
if (pattern[j] != pattern[k]) {
// 此时的 pattern[k] 即为 pattern[next[j] ]
next[j] =k;
} else {
// 假设 pattern[j] == pattern[next[j]]。则 k = next[k]
next[j] = next[k];
}
} else {
k = next[k]; // 不匹配。向前找前缀。相当于用模式串匹配模式串
}
}
} int KMPSearch(string str, string pattern) {
if (str.size() == 0 || pattern.size() == 0)
return -1;
GetNext(pattern);
int j = 0; // 待匹配串索引
int k = 0; // 模式串索引
while (j < str.size() && k < (int)pattern.size()) { //注意,负数不能和 size_t 的无符号数作比較
if (k == -1 || str[j] == pattern[k]) {
++k;
++j;
} else {
k = next[k]; // 不匹配,移动模式串
}
}
if (k == pattern.size())
return j-k;
else
return -1;
}
Solution() {
next = NULL;
}
~Solution() {
if (next != NULL)
delete []next;
next = NULL;
}
private:
int *next;
}; int main()
{
string str = "abacababc";
string pattern = "abab";
Solution sol;
cout << sol.KMPSearch(str, pattern) << endl;
}

相关:

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. axios的坑

    1.axios默认发送application/json 格式 https://www.cnblogs.com/qdcnbj/p/8143155.html 资料: https://www.npmjs.c ...

  2. Node_进阶_5

    Node进阶第五天 为什么mysql不用开mongod –dbpath xx… 答:因为mysql会在”服务”中运行,也就是开机时自动启动并且长久驻扎在内存中了. mongodb其实也能通过设置来设成 ...

  3. shell的通俗理解

    (引自:https://zhidao.baidu.com/question/557066905.html) [一] shell的含义: 首先shell的英文含义是“壳”: 它是相对于内核来说的,因为它 ...

  4. 【BZOJ 1406】 [AHOI2007]密码箱

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] \(x^2%n=1\) \(x^2-1 = k*n\) \((x+1)*(x-1) % n == 0\) 设\(n=a*b\) 对于 ...

  5. Java基础学习总结(43)——Java8 Lambda揭秘

    再了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么?. 这是一个有趣的问题,涉及到JDK的具体的实现. 本文将介绍OpenJDK对L ...

  6. TOMCATserver不写port号、不写项目名訪问项目、虚拟文件夹配置

    一.不写port. 这个问题都被问烂了.由于TOMCAT默认的訪问port为8080.而TCP/IP协议默认80port訪问,大家之所以看到别的站点都不写port号是由于人家用的的80port訪问的, ...

  7. 2、Python列表和元组

    2.Python序列 序列是一种数据存储方式,类似于C语言的数组.简单的说序列是一块用来存储多个值的连续内存空间,同一个序列的元素通常是相关的. Python中常用的序列结构有列表.元组.字典.字符串 ...

  8. mac鼠标滚动方向自然问题

    mac使用鼠标的时候滚轮方向和Windows是相反的.假设不勾选滚动方向自然,那么触摸板使用不爽. 解决的方法: 1.打开http://pilotmoon.com/scrollreverser/,下载 ...

  9. linux内核设计的艺术--系统启动第一步

    计算机究竟是如何执行起来的呢,在我学习计算机的时候一直不是非常明确,可是近期借了本<linux内核设计的艺术>算是知道了计算机从按开机到启动操作系统之间究竟做了些什么. 这本书刚開始介绍的 ...

  10. bzoj1433: [ZJOI2009]假期的宿舍(最大二分图匹配)

    1433: [ZJOI2009]假期的宿舍 题目:传送门 题解: 这题有点水 跑个二分图匹配就完事了(注意在校生不是一定都互相认识) 代码: #include<cstdio> #inclu ...