算法(4)KMP算法易懂版(看毛片算法,这下要是还看不懂你就来打我吧)

目录

1、字符串的前缀、后缀、最长相等前后缀

2、部分匹配值(Partial Match,PM)

3、暴力匹配

4、KMP算法


KMP算法其实不难,只是市面上的千人千面的描述,把一个简单的算法越描述越乱了。

KMP由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)

比如在主串s=“ababcabcacbab”中找出模式串p="abcac"第一次出现的位置。

1、字符串的前缀、后缀、最长相等前后缀

前缀:除最后一个字符之外,字符串其余部分的所有头部子串

后缀:除第一个字符之外,字符串其余部分的所有尾部子串

‘a’的前缀和后缀都是空集,最长相等前缀和后缀长度为0。

“ab”的前缀为{a},后缀为{b},{a}∩{b}=∅,最长相等前后缀长度为0

‘aba’的前缀为{a,ab},后缀为{a,ba},{a}∩{b}={a},最长相等前后缀长度为1

‘abab’的前缀为{a,ab,aba},后缀为{b,ab,bab},{a}∩{b}={ab},最长相等前后缀长度为2

2、部分匹配值(Partial Match,PM)

字符串“abcac”的部分匹配值为00010。

部分匹配值的每一位代表的含义就是当前最长相等前后缀长度。

3、暴力匹配

4、KMP算法

KMP算法的原理是对子串进行分析,找出已匹配部分的最大相同前后缀,尽可能减少暴力破解中的频繁回溯问题。

移动位数:已匹配的字符数-对应的部分匹配值

KMP算法的优点在于父串不用回退,回退操作在子串上,对子串进行分析即可。

你可能感兴趣的:(算法)