KMP算法的核心思想是next数组。
接下来,我来谈谈我对KMP数组的理解。
KMP算法是用来匹配有多少相同字串的一种算法。
1、next数组记录前缀与后缀相等的位置,然后跳到这。
2、数组即记录后缀与前缀相等的个数
如ABCABC
那么next数组就是
0 | 1 | 2 | 3 | 4 | 5 | 6 |
-1 | 0 | 0 | 0 | 1 | 2 | 3 |
KMP算法核心
int next_[1000010]; void kmp(char x[],int m,int next_[]) { int i ,j; j = next_[0] = -1; i = 0; while( i < m){ while(-1!=j&&x[i]!=x[j]) j = next_[j]; next_[++i] = ++j; } }
返回x 在 y 中出现的次数,可以重叠
int kmp_count(char x[],int m,char y[],int n) { int i,j; int ans = 0; kmp(x,m,next_); i = j = 0; while(i < n) { while(-1!=j && y[i]!=x[j]) j = next_[j]; i++;j++; if(j >= m) { ans++; j = next_[j]; } } return ans; }
还可以预处理,这里就暂时不谈了
e-KMP类似
0 | 1 | 2 | 3 | 4 | 5 | 6 |
6 | 0 | 0 | 3 | 0 | 0 | 0 |