C语言实现:KMP算法

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

#define NOTHAVE 0
int strlen(char *c){
    int i=0;
    while(c[i] != '\0'){   //字符串以'\0'结尾
        i++;
    }
    return i;
}

/*--------------------------------------------------------------------------------------------------------*/

void GetNext(char c[], int *next){
    int i=1,j=0, n;
    next[0]=0;
    n = strlen(c);
    while(i < n){
        if( j==0 && c[i]!=c[j] ) {
            next[i]=0; ++i;
        }
        else if( c[i]==c[j] ){
            j++; next[i]=j; i++;
        }
        else{
            j=next[j-1];
        }
    }
}

/*--------------------------------------------------------------------------------------------------------*/

int KMPmatch(char original[],char module[]){
    int orlen,molen,i=0,j=0 ;
    int next[100];                //模式串最大长度100
    GetNext(module,next);
    orlen = strlen(original); molen = strlen(module);
    while(i<orlen && j<molen){
        if(j==0 && original[i]!=module[j]){
            ++i;
        }
        else if( original[i]==module[j] ){
            ++i;  ++j;
        }
        else{
            j=next[j];
        }
    }
    if(j==molen) return i-j+1;   //匹配成功,返回变量所在位置
    else if(i==orlen) return NOTHAVE;
    else return -9999;
}

/*--------------------------------------------------------------------------------------------------------*/
int main(){
    char origin[50],modu[10]; int next[50]; int i,n;
    scanf("%s",origin);
    scanf(" %s",modu);
    GetNext(modu, next);
    n = strlen(modu);
//    for (i=0; i<n; i++){
//        printf("%d,",next[i]);
//    }
    int num = 0;
    num = KMPmatch(origin, modu);
    printf("\n%d",num);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值