|
发表于 2017-12-9 10:21:32
|
显示全部楼层
#include <stdio.h>
typedef char* String;
void get_next( String T, int *next )
{
int j = 0;
int i = 1;
next[1] = 0;
while( i < T[0] )
{
if( 0 == j || T[i] == T[j] )
{
i++;
j++;
if( T[i] != T[j] )
{
next[i] = j;
}
else
{
next[i] = next[j];
}
}
else
{
j = next[j];
}
}
}
// 返回子串T在主串S第pos个字符之后的位置
// 若不存在,则返回0
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 str[255]="ababaaaba";
int next[255];
int i=1;
str[0]=9;
get_next(str,next);
printf("next数组的取值:\n");
for(i=1;i<10;i++)
{
printf("%3d",next[i]);
}
putchar('\n');
} |
|