数据结构--串 KMP匹配

一、首先了解字符串匹配的基本原理:
http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html

二、求解next数组:

void makeNext(char p[],int next[]){
    int q,k;//k是最大前缀长度,q是匹配串下标
    next[0] = 0;
    for(q=1,k=0;q<strlen(p);q++){
        //若果不相等,那么就从上一次个字符串最长前缀处查看,依次类推
        while(k>0&&p[q]!=p[k]){
            k = next[k-1];
        }
        if(p[q]==p[k]){
            k++;
        }
        next[q] = k;
    }
}

以上程序转载自https://www.cnblogs.com/bdbk/p/5202482.html

解释:
例如匹配串:abcdabd。
q:匹配串的下标
p[q]:匹配串的字符
k:最大前缀长度
p[k]:最大前缀里的最后一个字符

以上程序:p[q]=’b’,p[k]=a,在p[q]还未指向最后时,p[q]不断后移,直至p[k]=a,p[q]=a时(即abcda),此时p[k]=p[q],因此k++,next[q]为next[4]=1;

然后p[q]指向b,p[k]为b,此时为abcdab,此时p[k]=p[q],因此k++,
next[5]=2;

然后p[q]指向d,p[k]为c,此时为abcdabd,p[q]不等于p[k]且k>0,因此k=next[k-1]=next[1]=0;,next[6]=k=0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值