kmp matching
看了算法导论,有点迷糊。照着为代码敲出来的C。数组都前移了一位,就实现 了。
主要是计算前缀数组的有点抽象。简单的说就是,next[j]表示当模式串t中第j个字符与主串中相应字符(即Si)不相等时,模式串中需重新和主串中该字符Si进行比较的字符位置k,即下次开始比较Si与Tk。我们希望子串能尽量快的右移,当出现不匹配的情况时。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
void KMP(char *T, char *P);
int *Compute(char *p);
int main()
{
char t[100], p[100];
scanf("%s %s", t, p);
KMP(t,p);
return 0;
}
void KMP(char * t, char * p)
{
int i, n, m, q, *next;
n = strlen(t);
m = strlen(p);
next = Compute(p);
q = 0;
for(i = 0; i < n; i++)
{
while(q > 0 && p[q] != t[i])
q = next[q - 1];
if(p[q] == t[i])
{
q++;
}
if(q == m )
{
printf("find a match in the position %d\n",i-m+2);
//printf("%s\n",&t[i-m+1]);
q = next[q-1];
}
}
}
int * Compute(char *p)
{
int m,k,q,*next;
next = (int *)malloc(100*sizeof(int));
m = strlen(p);
next[0] = 0;
k = 0;
for(q = 1; q < m; q++)
{
while(k > 0 && p[k] != p[q])
{
k = next[k - 1];
}
if(p[k] == p[q])
k++;
next[q] = k;
// printf("p[%d] = %c p[%d] = %c k = %d q = %d next[%d] = %d\n", k, p[k], q, p[q], k,q,q,next[q]);
}
return next;
}