思想不要求理解,只需要会计算next和nextval数组就可以
#include<stdio.h>
#include<stdlib.h>
typedef struct Strs{
char *ch;
int length;
} HString;
void AccountLength(char *arr,int *length) {
for (char *p=arr;*p!='\0';++p)
++(*length);
}
void StrAssign(HString *Str, char *arr) {
int length=0;
AccountLength(arr,&length);
Str->ch = (char *)malloc(sizeof(char)*length);
Str->ch = arr;
Str->length=length;
}
int KmpIndex(HString *S, HString *T, int nextArr[]) {
int i,j=1;
while((i<S->length)&&(j<T->length)) {
if(j==0 || S->ch[i]==T->ch[j]) {
++i;
++j;
} else {
j=nextArr[j];
}
}
if(j==T->length) {
return i-j+1;
}
return -1;
}
int main() {
HString Str1, Str2;
StrAssign(&Str1, "#aaabaaaab");
StrAssign(&Str2, "#aaaab");
int nextArr[6]={-1,0,1,2,3,4};
int nextvalArr[6]={-1,0,0,0,0,4};
int index;
index=KmpIndex(&Str1, &Str2, nextvalArr);
if(index>0) {
printf("succsess to find in and the index is %d\n",index);
} else {
printf("fail to find!\n");
}
}