一道简单的KMP(具体算法看我上一篇博客),题上说需通过s1的循环移位,是不是要把s1每移一位后的字符串都拿来进行一次KMP呢,tmd这样也太复杂了吧,那得进行多少次KMP啊,其实移着移着发现只要将s1字符串接在它自己的后面,得到一个新的字符串,只需要匹配一次就ok了,比如:AABCD 接后变成AABCDAABCD,再进行一次KMP就ok了!贴代码:
#include<stdio.h>
#include<string.h>
#define MAX 100010
char t[MAX*2],s[MAX*2];
int next[MAX*2];
void GetNextval(){ //得到next数组
int i=0;
int plen=strlen(t);
int j=-1;
next[0]=-1;
while(i<plen){
if(j==-1||t[i]==t[j]){
next[++i]=++j;
}
else j=next[j];
}
}
bool KMP(){ //KMP匹配算法
int i=0;
int j=0;
int len=strlen(s);
int plen=strlen(t);
while(i<len){
if(j==-1||t[j]==s[i]){
i++;
j++;
}
else j=next[j];
if(j==plen)return true;
}
return false;
}
int main()
{
int i;
while(scanf("%s%s",s,t)!=EOF){
int len=strlen(s);
if(len<strlen(t)){
printf("no\n");
continue;
}
for(i=0;i<len;i++){ //字符串接上它本身形成新的字符串
s[i+len]=s[i];
}
s[i+len]='\0';
GetNextval();
if(KMP())printf("yes\n");
else printf("no\n");
}
return 0;
}

本文介绍了一种利用KMP算法判断两字符串是否为亲和串的方法。通过将字符串s1自身连接生成新串,并对s2进行一次KMP匹配,以此判断s2是否为s1的亲和串。
453

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



