KMP 算法的关键在于初始化next[ ] 数组
void getnext(char *b)
{
int len=strlen(b); / / 待匹配字符串的长度
next[0]=next[1]=0; / /初始化第一个数和第二个数
for(int i = 1; i < len ; i++){
int j=next[i] ; / / 用 j 来记录每次匹配失败返回的位置
while ( j && b[i] ! =b[j] )
j = next[ j ]; / / 往前寻找相同字符,返回位置
next[ i + 1 ] = b[i]==b[i+1] ? j+1: 0; / / 如果找到与当前匹配字符相等的位置,在此位置+1
/ / 否则从0 开始匹配
}
}
有了 next[ ] 数组 KMP 函数就很容易了
int KMP(char *a , char * b){
getnext();
int l1=strlen(a), l2=strlen(b); / / l1为匹配字符串长度 ,l2为待匹配字符串长度
int i , j = 0, ans=0; / / j 用来记录匹配长度
for(int i=0 ;i< l1; i++){
while ( j && a[i] ! = b[j] )
j = next [j] ; / / 若匹配失败,查找next[ ] 数组,返回重新匹配
if ( a[i] == b[j]) j++; / / 匹配个数
if ( j == l2 ) break;
}
if( j == l2) return i - l2 + 2; / / 若找到返回找到的位置
else return -1; / / 若没有找到返回 -1
}