KMP最常用的模板

来源:互联网 发布:巨人网络私有化退市 编辑:程序博客网 时间:2024/05/16 01:40

1、适用于前后缀的最大匹配

Pabcdabcdabcd

F0000012345678

F[12] = 8,含义:前8个字符和后8个字符一样,且最小循环节长度是4

char s[1010], p[1010];int f[1010];void getf(){memset(f, 0, sizef(f));int i=0, j=-1;f[0] = -1;while(i<lp){if(j==-1 || p[i]==p[j]){i++, j++;f[i] = j;}else j = f[j];}}int KMP(){int ls=strlen(s);int lp=strlen(p);getf();}

2、优化后的,避免了重复判断的,效率较高

PABCDABCDABCD

F-1000-1000-1000

char s[1010], p[1010];int f[1010];void getf(){memset(f, 0, sizef(f));int i=0, j=-1;f[0] = -1;while(i<lp){if(j==-1 || p[i]==p[j]){i++, j++;if(p[i]!=p[j]) f[i]=j;else f[i] = f[j]; }else j = f[j];}}int KMP(){int ls=strlen(s);int lp=strlen(p);getf();}


0 0