http://www.cnblogs.com/zhangtianq/p/5839909.html
这个博客主要是理解KMP(字符串普通匹配)
普通next:

1 ///这里还是不要用next命名数组啦 2 3 void findnext() 4 { 5 memset(nextt,0,sizeof(nextt)); 6 int j=0,k=-1; 7 nextt[0]=-1; 8 int len=strlen(b); 9 while(j<len) 10 //while(j<len-1) 11 { 12 if(k==-1||b[k]==b[j]) 13 { 14 k++;j++ 15 nextt[j]=k; 16 } 17 else 18 k=next[k]; 19 } 20 }
普通kmp:

1 int kmp() 2 { 3 int i=0,j=0; 4 int sa=strlen(a),sb=strlen(b); 5 while(i<sa&&j<sb) 6 { 7 if(j==-1||a[i]==b[j]) 8 { 9 i++; 10 j++; 11 } 12 else 13 { 14 j=nextt[j]; 15 } 16 } 17 if(j==sb) 18 return i-j+1; 19 else 20 return -1; 21 }
下面针对next数组的其他应用:
1、求模式串在目标串中的出现次数;
修改了一下kmp即可:

1 ///可重叠 2 3 int kmp() 4 { 5 int i=0,j=0,ans=0; 6 int sa=n,sb=m; 7 while(i<sa) 8 { 9 if(j==-1||a[i]==b[j]) 10 { 11 i++; 12 j++; 13 } 14 else 15 { 16 j=nextt[j]; 17 } 18 if(j==sb) 19 { 20 j=nextt[j];ans++; 21 } 22 } 23 return ans; 24 }

1 int kmp() 2 { 3 int i=0,j=0,ans=0; 4 int sa=strlen(a),sb=strlen(b); 5 while(i<sa) 6 { 7 if(j==-1||a[i]==b[j]) 8 { 9 i++;j++; 10 } 11 else 12 j=nextt[j]; 13 if(j==sb) 14 { 15 j=0;ans++; 16 } 17 } 18 return ans; 19 }
2、求一个字符串中最长子串(整一个字符串=n*子串)。
比如字符串:abcabcabc 。目测其最长子串为:abc,长度为3。
next数组中,每一个字符的值:
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | len |
字母 | a | b | c | a | b | c | a | b | c |