KMP算法C语言实现
#include "stdafx.h"
#include <string>
void compute_prefix(char P[], int length, int pi[]);
void kmp_matcher(char T[],char P[],int pi[], int length_t, int length_p);
int _tmain(int argc, _TCHAR* argv[])
{
char T[]="bacbabababcbab";
char P[]="ababababca";
int pi[7];
kmp_matcher(T,P,pi,strlen(T),strlen(P));
return 0;
}
void kmp_matcher(char T[],char P[],int pi[], int length_t, int length_p)
{
int n = length_t;
int m = length_p;
compute_prefix(P,length_p,pi);
int q = 0;
for (int i = 0 ;i<n;i++)
{
while(q>0 && P[q]!=T[i])
q = pi[q-1];
if(P[q]==T[i])
q++;
if(q==m)
{
printf("Pattern occurs with shift %d\n",i-m+1);
q = pi[q-1];
}
}
}
void compute_prefix(char P[], int length, int pi[])
{
int m = length;
pi[0] = 0;
int k = 0;
for(int q = 1;q < m;q++)
{
while( k>0 && P[k]!=P[q])
k = pi[k-1];
if (P[k]==P[q])
k++;
pi[q] = k;
}
}