kmp是从最初的字符串匹配算法优化而来的,其中就是多了一个函数值函数,记录最后
的匹配的,从而得到优化,有回溯的感觉。只是对kmp的函数值函数求法有的不理解
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int n[1000];
char str1[1000];
char str2[1000];
int sum;
void kmp(char *p,int next[])
{
int i;
int j=0;
int k=-1;
next[0]=-1;
while(p[j]!='\0')
{
if(k==-1||p[j]==p[k])
{
j++;
k++;
if(p[j]!=p[k])
next[j]=k;
else
next[j]=next[k];
}else
{
k=next[k];
}
}
//for(i=0;i<j;i++)
//printf("%d ",next[i]);
//printf("\n");
}
void makekmp()
{
int i,j;
int len1=strlen(str1);
int len2=strlen(str2);
//printf("%d%d\n",len1,len2);
for(i=0,j=0;i<len1;i++)
{
while(str1[i]==str2[j])
{
if(j==len2)
break;
i++;
j++;
}
if(j==len2)
{
j=0;
i--;
sum++;
}else
{
if(n[j]!=-1)
j=n[j];
else
j=0;
}
//printf("fz1:%d %d %d %d\n",len1,len2,i,j);
}
printf("%d\n",sum);
}
int main()
{
while(cin>>str1[0],str1[0]!='#')
{
//printf("%c\n",str1[0]);
scanf("%s%s",&str1[1],&str2);
kmp(str2,n);
sum=0;
makekmp();
}
return 0;
}