#include<stdio.h>
#include<string.h>
//c1==匹配串 c2==目标串(一般较长)
char c1[1111],c2[2222];
int next[1111];
void nextt()
{
int i = 0,j = -1;
next[0] = -1;
while(c1[i])
{
if(j == -1 || c1[i] == c1[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int kmp()
{
nextt();
int len1=strlen(c1);
int len2=strlen(c2);
int i=0,j=0;
while(i<len2&&j<len1)
{
if(j==-1||c2[i]==c1[j])
{
i++;
j++;
if(i==len2){
//可重叠 j=next[j]
//不可重叠 j=0
return j;//返回第一个符合的位置
}
}
else j=next[j];
}
return 0;
}
int main()
{
scanf("%s",c1);
nextt();
}
KMP模板
最新推荐文章于 2020-09-09 21:03:06 发布