參考:从头到尾彻底理解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计算得到好后缀表和坏字符表

最新文章

  1. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)
  2. August 27th 2016 Week 35th Saturday
  3. 【GOF23设计模式】原型模式
  4. 轻量级应用开发之(06)Autolayout自动布局1
  5. 基于spring-redis发布订阅模式的实现
  6. CAP定理与RDBMS的ACID
  7. BZOJ 2228 礼物(gift)(最大子长方体)
  8. Codevs 1371 浴火银河跑运输
  9. [搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
  10. Linux优化之IO子系统监控与调优
  11. Invoke()/BeginInvoke()区别
  12. How To Cluster Rabbit-MQ--reference
  13. koa 路由配置
  14. [物理学与PDEs]第1章习题14 求解 rot 方程
  15. topcoder srm 662 div1
  16. 关于Laravel框架
  17. BZOJ 3932 [CQOI2015]任务查询系统 - 差分 + 主席树
  18. [javascript] javascript 实现数据滚动加载
  19. vmware 8 完美支持UEFI+GPT模式虚拟机
  20. jqgrid api

热门文章

  1. Ncomputering 安装及参数设置
  2. pace.js 原理(转)
  3. 小程序自定义tabbar
  4. thttpd 在S3C6410的移植-web服务程序的应用
  5. [置顶] Netty学习总结(1)——Netty入门介绍
  6. Git学习总结(7)——Git GUI学习教程
  7. C#-反射知识点(转载)
  8. 洛谷——P1428 小鱼比可爱
  9. lower_bound与upper_bound
  10. 009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)