#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=100;
int next[maxn];
int next2[maxn];//改进kmp
char a[maxn];
char b[maxn];
int la;
int lb;
int ant1=0,ant2=0,ant3=0;
int abc0(int x)
{
for(int i=x;i<lb+x;i++)
{
ant1++;
if(a[i]!=b[i-x])
return 0;
}
return 1;
}
void abc()//KMP求next
{
int i=0,j=-1;
next[0]=-1;
while(i<lb)
{
if(j==-1||b[j]==b[i])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
void abc2()//改进KMP求next2
{
int i=0,j=-1;
next2[0]=-1;
while(i<lb)
{
ant2++;
if(j==-1||b[j]==b[i])
{
i++;
j++;
if(b[i]!=b[j])
next2[i]=j;
else
next2[i]=next2[j];
}
else
j=next2[j];
}
}
int main()
{
int i=0,j=0;
scanf("%s%s",a,b);
la=strlen(a);
lb=strlen(b);
for(i=0;i<la-lb+1;i++)
{
if(abc0(i))
{
printf("BF查找到位置:%d\n",i+1);
break;
}
}
if(i==la-lb+1)
printf("BF未查找到\n");
printf("BF对比次数:%d\n\n",ant1);
i=0;
j=0;
abc();//预处理next 数组;
while(i<la&&j<lb)
{
ant2++;
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==lb)
printf("kmp查找到位置 %d\n",i-lb+1);
else
printf("kmp未查找到\n");
printf("kmp对比次数:%d\n\n",ant2);
abc2();//预处理next2数组;
i=0;
j=0;
while(i<la&&j<lb)
{
ant3++;
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
j=next2[j];
}
if(j==lb)
printf("改进kmp查找到位置 %d\n",i-lb+1);
else
printf("改进kmp未查找到\n");
printf("改进对比次数:%d次\n\n",ant3);
return 0;
}
/*
aaabaaaaaac
aaac
*/
kmp+kmp改+bf
猜你喜欢
转载自blog.csdn.net/qq_43851311/article/details/103029542
今日推荐
周排行