KMP-基础

来源:互联网 发布:欧文总决赛数据统计 编辑:程序博客网 时间:2024/06/09 22:09

        KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。

        关键是求 next();数组。

下标012345chabacabnext();001012


KMP-模板:

#include<cstdio>#include<cstring>#define M 1000010int p[M];  //相当于next()char ch[M],str[M];int len,lens,cnt;void getp()   //模板 {int i,j;i=0;j=-1;p[i]=j;while(i<len){if(j == -1 || ch[i] == ch[j]){i++,j++;p[i]=j;}elsej=p[j];}}void kmp(){getp();int i,j;i=0;j=0;while(i<lens){if(j == -1 || str[i] == ch[j]){i++,j++;if(j == len)cnt++;}elsej=p[j];}}//查找母串中有多少 标准模式串int main(){while(scanf("%s%s",ch,str)!=EOF)  //ch为标准模式串,str为母串 {len=strlen(ch);lens=strlen(str);cnt=0;kmp();printf("%d\n",cnt);}return 0;}

0 0
原创粉丝点击