KMP中f数组意义:对于模式串的前i个字母构成的子串,这个子串会有一些前缀和后缀完全相同(包括长度),f[i]表示的就是这个最大的长度,而长度确定了前缀后缀就确定了。
对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。
注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后缀,这个自己画一下图就知道了,思想就是对于后缀中的一部分对应着前缀中的一部分,而这部分在后缀中又对应前缀中的一部分,这样传递下去。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[50005];
char b[50005];
char c[100005];
int f[100005];
int main(){
while(~scanf("%s%s",a,b)){
int la=strlen(a);
int lb=strlen(b);
strcpy(c,a);
strcat(c,b);
int lc=strlen(c);
f[0]=f[1]=0;
for(int i=1;i<lc;i++){
int j=f[i];
while(j&&c[i]!=c[j]) j=f[j];
f[i+1]=(c[i]==c[j]?j+1:0);
}
int res=f[lc];
res=min(res,la);
res=min(res,lb);
if(res){
for(int i=0;i<res;i++){
printf("%c",c[i]);
}
printf(" %d\n",res);
}
else printf("%d\n",res);
}
return 0;
}
本文深入讲解了KMP算法中f数组的意义及计算方法,并通过示例代码展示了如何利用KMP算法寻找两个字符串间的最大公共前后缀长度。
&spm=1001.2101.3001.5002&articleId=46923603&d=1&t=3&u=01581bec664645179ce6e3752f78eaa9)
467

被折叠的 条评论
为什么被折叠?



