看了大佬的文章和大佬的视频后做出来辣,记得半年前这玩意还把我整得死去活来,现在终于可以驾驭辣。
核心思想就是:重点在模式串而不是目标串,再建一个数组用于下一次重新匹配时定位模式串配对位置@-@。KMP真的牛逼啊,时间复杂度一下就低了好多
上代码~~
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
int find(char* targ,char* mode,int *indexs,int n_t,int n_m)
{
int counter=0;
int k=0;
for(int i=0;i<n_t;)
{
if(targ[i]==mode[k])
{int j=k;
for(;j<n_m;j++)
{ k=indexs[j];
if(targ[i]==mode[j])
{
i++;
}
else
{
break;
}
}
if(j==n_m)
{
counter++;
}
}
else
{
i++;
}
}
return counter;
}
int main()
{
//目的就是找targ里面有多少mode
char *targ=(char*)malloc(sizeof(char)*MAX);
char *mode=(char*)malloc(sizeof(char)*MAX);
int n_t;
int n_m;
scanf("%d",&n_t);
int i;
getchar();
for(i=0;i<n_t;i++)
{
scanf("%c",&(targ[i]));
}
getchar();
scanf("%d",&n_m);
getchar();
for(i=0;i<n_m;i++)
{
scanf("%c",&(mode[i]));
}
getchar();
int *indexs=(int *)malloc(sizeof(int)*MAX);
indexs[0]=0;
for(i=1;i<n_m;i++)
{
int k=0;
if(mode[i]==mode[k])
{
indexs[i]=k+1;
i++;
k++;
int j;
for(j=i;j<n_m;j++)
{
if(mode[j]==mode[k])
{
indexs[j]=k+1;
k++;
}
else
{
indexs[j]=0;
break;
}
i=j;
}
}
else{
indexs[i]=0;
}
}
printf("%d",find(targ,mode,indexs,n_t,n_m));
system("pause");
}