字符串匹配算法(KMP算法c语言实现)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*naive string-matching algorithm,T为原始字符串,P为需要匹配的字符串*/
void naiveMatch(char *T,char *P)
{
    int lenT,lenP,i,j;
    lenT=strlen(T);
    lenP=strlen(P);
    if(lenT<lenP)/*需要匹配的字符串比原始字符串还要长出错*/
    {
        perror("input error");
        return ;
    }
    for(i=0;i<(lenT-lenP+1);i++)
    {
        for(j=0;j<lenP;j++)
        {
            if(T[i+j]!=P[j])
                break;
        }
        if(j==lenP)
            printf("string match at place %d\n",i);
    }
}

/*kmp预处理需要的匹配串*/
void getNext(char *p,int next[])
{
    int len,i,j;
    len=strlen(p);
    next[0]=0;
    for(i=1;i<len;i++)
    {
        j=next[i-1];
        while((p[i-1]!=p[j-1])&&(j!=0))
        {
            j=next[j-1];
//            printf("j= %d\n",j);
        }
        next[i]=j+1;
        printf("next[i]=%d\n",next[i]);
    }
}

/*kmp字符串匹配算法*/
void kmp(char *t,char *p,int next[])
{
    int lent,lenp,i,j;
    lent=strlen(t);
    lenp=strlen(p);
    i=0;
    j=0;
    while(i<(lent))
    {
        if((j==-1)||(t[i]==p[j]))
        {
            i++;
            j++;

//            printf("i=%d,j=%d\n",i,j);
        }
        else
        {
           
//            printf("in else i=%d,j=%d\n",i,j);
            j=next[j]-1;
        }
        if(j==(lenp))
        {
            printf("match at place %d\n",i-lenp);
        }
    }
}

int main()
{
    char p[10]="0001";
    char t[20]="000010001010001";
    naiveMatch(t,p);/*测试普通字符串匹配算法*/
    char p1[10]="abaabcac";
    char t1[20]="acabaabaabcacaabc";
    int len=strlen(p1);
    int *next;
    next=(int*)malloc(sizeof(int)*len);
    getNext(p1,next);
    kmp(t1,p1,next);/*测试kmp算法*/


  
    getNext(p,next);
    kmp(t,p,next);/*测试kmp算法*/
}

posted on 2011-02-23 16:43  tankzhouqiang  阅读(2219)  评论(4编辑  收藏  举报