KMP算法
一:
- 特点:在匹配的过程中,不需要回溯主串的针,且时间复杂度可以达O(m+n)
- KMP算法:KMP为(DE. Knuth与JH. Morris和VR. Pratt))同时发现的算法,因此人们称之为克努特一莫里斯普拉特算法。
- 在主串中设置指示器i表示主串S中当前比较的字符;在模式串T中设置指示器j表示模式串T中当前比较的字符。
#include <stdio.h>
int Index_KMP(SString S,int pos,SString T){
int i = pos,j = 1;
while(i<=S.len && j <= T.len){
if(j==0 || S.ch[i]==T.ch[j]){
// j = 0表示当前比较的是模式串首字符且不匹配应从主串后继字符起从头比较
++i;
++j;
}
else {
j = next[j];
}
}
if(j > T.len)
return i - T.len;
else
return 0;
}
二、next值!
KMP算法中,每当一趟匹配过程中出现失配时,主串S中的i指针不需要回溯,而是利用已经得到的“部分匹配”结果,将模式串向右“滑动”尽可能远的一段距离后,继续进行比较,从而快速达到匹配结果。
例子:abaabca:
串长+1!!!!!!
即 j=4时
真前缀与真后缀长都是 a 即 串长是1
所以 next 的【j】=1+1=2