代码内容来自《大话数据结构》,程杰著。
针对书中源代码进行了修改,原书中字符串数组[0]存储为字符串长度,本代码处未使用该空间,字符串从[0]处开始存储。
#include <stdio.h>
#include <string.h>
void get_next(char *T, int *next) {
int i,j, len = strlen(T);
i = 0;
j = -1;
next[0] = -1;
while (i < len) {
if (j == -1 || T[i] == T[j]) {
i++;
j++;
if(T[i] != T[j]) {
next[i] = j;
}
else {
next[i] = next[j];
}
}
else {
j = next[j];
}
}
}
int Index_KMP(char *S, char *T) {
int i = 0, j = 0, lenS = strlen(S), lenT = strlen(T);
int next[255];
get_next(S, next);
while (i<lenS && j<lenT) {
if (j == -1||S[i] == T[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j>=lenT) {
return i-lenT;
}
else {
return -1;
}
}
void main(void) {
char S[]={"FEGHABABAAABABBAAAB"};
char T[]={"ABABAAABA"};
printf("%d", Index_KMP(S,T));
}