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; }