KMP算法-理论

Posted zy1992

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法-理论相关的知识,希望对你有一定的参考价值。

今天刷leetcode,发现28-实现strStr()这道题,可以使用KMP算法实现,所以去百度了一翻,做个记录。

KMP算法简介:是一种改进的字符串匹配算法。

核心思想:通过匹配失败后的信息,尽量减少模式串与主串的匹配次数来达到快速匹配的目的。

leetcode题目:给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

1.自己写的算法:

假设 haystack 为  BBC ABCDAB ABCDABCDABDE

        needle   为   ABCDABD

思路:haystack 的下标为i,needle 的下标为j,当haystack .charAt(i)==needle .charAt(j)时,比较haystack i+1和needle j+1的值,如果都相同,那么返回下标

2.KMP算法:

该算法是对上述情况的优化,假设当i=4时,haystack 为   BBC ABCDAB ABCDABCDABDE  ,此时‘ ‘!=‘D‘,那么就要进行下次比较,i++,一直到i=8

                    needle    为           ABCDABD

时,又开始进行新一轮的比较

2个字符串之间进行判断是否相等。那么我们可以通过观察发现,i=8和i=4,AB为ABCDAB的前缀和后缀中最大共有元素的长度。

也就是说,当i=4,haystack 截取needle个数的字符串,为“ABCDAB ”,当判断到i=10时,失败了,那么此时,我们可以通过求i=9时,i从4到9的最大模式字串,为2,

那么我们就可以移动,移动位数 = 已匹配的字符数 - 对应的部分匹配值=6-2=4,i=8,进行下一轮的判断,中间的i=5,i=6,i=7可以省略

那么此时,我们需要求一下,needle    中每个下标的最大模式字串

技术分享图片

那么对应的长度为,0  0  0  0  1  2  0

下一篇,讨论代码

 

以上是关于KMP算法-理论的主要内容,如果未能解决你的问题,请参考以下文章

疫情封校在宿舍学习KMP算法详解(next数组详解)附例

kmp算法啥意思?

kmp算法详解

什么是KMP算法?KMP算法推导

KMP算法及KMP算法的应用(POJ2406)

KMP算法