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算法-理论的主要内容,如果未能解决你的问题,请参考以下文章