KMP算法——解决字符串匹配问题

一般来说在你没学过KMP算法前,你解决字符串匹配问题会采用BF算法------BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。

虽然这种方法可行,但是时间复杂度为O(m*n),对于长字符串效率较低,所以有人就研究出了KMP算法来提高解决该类问题时的效率问题。

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。

在讲KMP算法前我们先引入前后缀概念

1.前缀及一个字符串的第一个字母到倒数第二个字母

2.后缀及一个字符串的最后一个字母到正数第二个字母

举个例子 对于字符串 abaabb

前缀:abaab 后缀:baabb

3.最长相等的前后缀

对于 a既没有前缀也没有后缀所以它最长相等的前后缀长度为2

对于abaab最长相等的前后缀是ab,长度为2

对于ababa最长相等的前后缀是aba,长度是3

核心思想

本章讲了KMP算法的理论实现,关于KMP算法的代码实现以及next数组的优化放到下一章来进行赘述。

相关推荐
小月球~6 小时前
天梯赛 · 并查集
数据结构·算法
仍然.7 小时前
算法题目---模拟
java·javascript·算法
潇冉沐晴9 小时前
DP——背包DP
算法·背包dp
GIOTTO情9 小时前
2026 世界互联网大会亚太峰会|AI 时代媒介投放的技术实战与算法优化
人工智能·算法
逆境不可逃9 小时前
LeetCode 热题 100 之 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转换为二叉搜索树 98. 验证二叉搜索树
算法·leetcode·职场和发展
计算机安禾9 小时前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
副露のmagic10 小时前
哈希章节 leetcode 思路&实现
算法·leetcode·哈希算法
csuzhucong10 小时前
puzzle(1037)黑白、黑白棋局
算法
XiYang-DING10 小时前
【LeetCode】链表 + 快慢指针找中间 | 2095. 删除链表的中间节点
算法·leetcode·链表
Zarek枫煜10 小时前
[特殊字符] C3语言:传承C之高效,突破C之局限
c语言·开发语言·c++·单片机·嵌入式硬件·物联网·算法