#include "stdafx.h"
#include <stdio.h>
typedef char* String;
void get_next(String T,int *next){
next[1]=0;
int j=0;
int i=1;
while(i<T[0]){ //i是后缀,j是前缀
if(j==0||T[i]==T[j]){
i++;
j++;
if(T[i]!=T[j]){
next[i] = j;
}else{
next[i] = next[j];
}
}else{
//j回溯
j = next[j];
}
}
}
//因为前缀时固定的,后缀是相对的
//返回子串T在主串S在pos个字符后的位置
int Index_KMP(String S,String T,int pos){
int i = pos;
int j = 1;
int next[255];
get_next(T,next);
while(i<=S[0] && j<=T[0]){
if(0==j||S[i]==T[j]){
i++;
j++;
}
else{
j = next[j];
}
}
if(j>T[0]){
return i-T[0];
}
else{
return 0;
}
}
int main(){
char T[255] = " sda"; //数组0存放数组的长度
T[0] = 3;
char S[255] = " asdasdasdsadasd";
S[0] = 15;
int pos = Index_KMP(S,T,0);
printf("%d",pos);
scanf_s("%d",&pos);
return 0;
}
关键next数组的生成,匹配失败的回溯,next数组前缀与后缀的理解。
若字符串为 ababababs
对于s来说 最大前缀为 abababa 最大后缀为 bababab 相等的前缀与后缀长度为2,ab,所以next数组在s处为3.