KMP算法(1)-理论

今天刷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

下一篇,讨论代码

猜你喜欢

转载自www.cnblogs.com/zy1992/p/9068103.html