数据结构--串 KMP匹配

来源:互联网 发布:mysql int字段累加 编辑:程序博客网 时间:2024/06/06 20:47

一、首先了解字符串匹配的基本原理:
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;