1、适用于前后缀的最大匹配
P:abcdabcdabcd无
F:0000012345678
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、优化后的,避免了重复判断的,效率较高
P:ABCDABCDABCD
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();
}