其实老早就想学习KMP算法了,只不过是没机会,嘿嘿。
今天说什么也得学习学习,今天一狠劲学了,感觉,其实还是比较抽象的。。。
尤其是那个next函数。。。表示真的狠难接受,,自己捉摸了很久也弄不懂。
所以这个也就成了一个遗留问题了,还的i找别人来帮我解决,诶。。。
但是,我还是能够敲出代码。。汗。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
char str[1005],pat[1005];
int next[1005];
int N;
int M;
int pos;
void Next()
{
memset(next,0,sizeof(next));
int temp;
for(int i=1;i<M;i++)
{
temp=next[i-1];
while(temp&&pat[temp]!=pat[i])
{
temp=next[temp-1];
}
if(pat[temp]==pat[i])
next[i]=temp+1;
else
next[i]=0;
}
}
int KMP(int t)
{
int i=t;
int j=0;
while(str[i]&&pat[j])
{
if(str[i]==pat[j])
{
i++;
j++;
}
else if(j==0)
i++;
else
j=next[j-1];
}
pos=i;
if(j==M)
{
return 1;
}
return 0;
}
int main()
{
while(scanf("%s",str),strcmp(str,"#"))
{
scanf("%s",pat);
N=strlen(str);
M=strlen(pat);
pos=0;
int temp=0;
Next();
while(str[pos])
{
int ans=KMP(pos);
temp+=ans;
}
printf("%d\n",temp);
}
return 0;
}