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;
    }
}

posted on 2012-12-17 08:41  小唯THU  阅读(486)  评论(0编辑  收藏  举报

导航