博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP算法讲解与实现
阅读量:2090 次
发布时间:2019-04-29

本文共 1182 字,大约阅读时间需要 3 分钟。

KMP算法的核心: 避免了指针的回溯

1. 寻找子串和主串第一个相同的字符

此时的特点:当前字符以前,子串与主串全部相同。

在这里插入图片描述

2. 判断当前位置以前,子串的前溯和后溯的最大重叠子串

要求: 1. 最大重叠 2. 为真回溯(即不包含原串)

在这里插入图片描述

3. 移动子串

即对重叠子串进行操作

在这里插入图片描述

代码如下:

# include 
# include
# include
# include
# include
using namespace std;// KMP算法的核心是避免指针的回溯 // 当两个字符不匹配时, 寻找最大公共前后缀 void getNext(int next[], string t) {
int j = 0, k = -1; next[0] = -1; while(j < t.length() - 1) {
if(k == -1 || t[j] == t[k]) {
j++, k++;// if(t[++j] == t[++k]) { // 当两个字符相等时要跳过 // next[j] = next[k];// }// else {
// next[j] = k;// } next[++j] = ++k; } else {
k = next[k]; } }}int KMP(string s, string t) {
int next[t.length()]; int i = 0; // 主串的位置 int j = 0; // 模式串的位置 getNext(next, t); // 此处需要用int转化, 否则只经过一次循环, 原因未知 while(i < (int)s.length() && j < (int)t.length()) {
if(j == -1 || s[i] == t[j]) {
// 当j=-1时, 要移动i, j归零 i++; j++; } else {
// i = i - j + 1; i不需要回溯 j = next[j]; // j回退 } } return (j >= t.length()) ? (i - j) : (-1);}int main(void) {
string a = "abcabcbhijk"; string b = "bcb"; cout << KMP(a, b) << endl; system("pause"); return 0;}

输出结果:

在这里插入图片描述

参考文章:

转载地址:http://evlqf.baihongyu.com/

你可能感兴趣的文章
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>
剑指offer 20.顺时针打印矩阵
查看>>
剑指offer 23.从上往下打印二叉树
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
Leetcode C++《每日一题》20200625 139. 单词拆分
查看>>
Leetcode C++《每日一题》20200626 338. 比特位计数
查看>>