模式匹配的一种改进算法,是由D.E,Knuth 与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。此算法可以在O(n+m)的时间的数量级上完成串的模式匹配操作。改进在于:每当一趟模式匹配过程中出现的字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向向右“滑动”尽可能远的一段距离后,继续进行比较。(摘自严蔚敏版《数据结构》)(看完整篇你会懂01112231123456712)
next[j]函数,表明当前模式中第j个字符与主串中响应字符“失配”时,在模式中需重新和主串中欧冠该字符进行比较的字符位置。
举个栗子解释一下KMP的过程:
分析:看前面公式当j=1时,next[j]=0;
j=2时,j前面只有一个字符,没有前缀也没有后缀这个就是那个其他情况,next[j]=1。(讲道理,一般前面两个,第一个都是 0,第二个都是 1)
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | c | a | a | b | b |
next[j] | 0 | 1 |
分析:j=3,我们分别来找前缀和后缀,之前的字符‘a’与‘b’不相等,及 既不是等于0的情况没有找到相同的就是其他情况。
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | c | a | a | b | b |
next[j] | 0 | 1 | 1 |
分析:j=4,看这个字符的前面有没有一样的,没有,还是1
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | c | a | a | b | b |
next[j] | 0 | 1 | 1 | 1 |
分析:j=5,看这个字符的前面有一样的,这样得到k-1=1;k=2;
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | c | a | a | b | b |
next[j] | 0 | 1 | 1 | 1 | 2 |
j=6
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | c | a | a | b | b |
next[j] | 0 | 1 | 1 | 1 | 2 | 2 |
j=7
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | c | a | a | b | b |
next[j] | 0 | 1 | 1 | 1 | 2 | 2 | 3 |
图摆在这感觉就差不多了,emmmm出道题 模式串为:abcaabbcaabcaabdab next[j]序列是多少?
答案见第一段那一串数
看完还不懂私信我能看到就给你一对一讲(叉腰)还有nextval值回头补QAQ(嘟嘟囔囔:感觉应该也没人能看到我这篇)