T=abaacababcac;
P =ababc
在T中寻找P,并返回第一个位置
java中有一个函数可以实现这个
T.indexOf(P);
KMP算法首先要计算一个前缀表 prefix table;
P的前缀表是:
a 0
a b 0
a b a 1
a b a b 2
a b a b c 0
最长公共前后缀的长度,指的是除字符串本身外的最长连续子串;
比如abab的最长前缀是aba 最长后缀是bab 但是此时最长前缀和最长后缀不一样
最长公共前缀是ab,最长公共后缀是ab,此时相同,所以最长公共前后缀是ab,长度为2
计算得最长公共前后缀长度的列表是0 0 1 2 0,把最后一个0去掉,最前面加上一个-1 ,得到prefix table;
P= a b a b c
-1 0 0 1 2
0 1 2 3 4 索引;
T=abaacababcac;
P=ababc
将p与t进行匹配,从第一个位置开始,如果出现没有匹配上的位置,就将p的前缀表所指的数字当成索引,比如位置3的b未匹配成功,而此时b在索引表中是1,所以移动p使得索引1处的元素对应到这个位置,比较失败后下一次是从失败的位置开始。
T=abaacababcac;
P= ababc 第一次移动后,注意索引表中-1表示0之前的一个位置,移动之后重新匹配,执行上面的步骤
KMP算法:
1、求出前缀表
2、搜索