这两天简单研究了KMP ,网上有很多讲解的文章,我在这里就不班门弄斧啦。大家要是学的话,可以看看这个人写的http://www.matrix67.com/blog/archives/115 。KMP要是只看讲解,估计会很困难,大家可以结合具体例子去调试分析学习,比较快把。NEXT 有很多不同的版本,我喜欢传统的版本,下面就用POJ这个题做个模板把。
3561这个题目说的长。一看例子就知道,和那个剪画布的一模一样。就是从第二个里面找第一个串的数量。当然这里主串交长,简单的BF是行不通的。下面代码
1 #include<stdio.h> 2 #include<string.h> 3 char a[10001],s[1000101]; 4 int next[10001],len1,len2; 5 void NEXT() 6 { 7 8 int j,k; 9 next[0]=-1; 10 j=0; 11 k=-1; 12 while(j<len1) 13 { 14 if(k==-1||a[k]==a[j]) 15 { 16 k++; 17 j++; 18 next[j]=k; 19 } 20 else 21 k=next[k]; 22 } 23 } 24 int KMP() 25 { 26 int j=0,i=0,sum=0; 27 NEXT(); 28 while(i<len2) 29 { 30 if(j==-1||a[j]==s[i]) 31 { 32 i++; 33 j++; 34 } 35 else 36 j=next[j]; 37 if(j==len1)////模串到头说明匹配成功 38 sum++; 39 } 40 return sum; 41 } 42 int main() 43 { 44 int sum,T; 45 scanf("%d",&T); 46 while(T--) 47 { 48 scanf("%s%s",a,s); 49 len1=strlen(a); 50 len2=strlen(s); 51 sum=0; 52 sum=KMP(); 53 printf("%d\n",sum); 54 } 55 return 0; 56 }
第一次在博客园上写,有点生疏,以前一直在新浪上,但是代码太乱,也不想换窝,今天痛下决心换啦!