KMP算法

来源:互联网 发布:中国移动网络测速网址 编辑:程序博客网 时间:2024/06/08 18:23


很明显,kmp算法需要先求出next数组

经过分析,next数组手工过程如下:

设子串为p

我们需要将子串的当前元素与前一个元素的下标对应的next的值为下标的元素比较,即

p[i] == p[next[i-1]]
如果相等即,i++,next[i] = i;

若不相等,则分出两个情况。1、next[i-1] == 0 此时说明前面已经找不到可以匹配(再次利用)的子串,令next[i] = 0;

2、next[i-1] != 0 那么继续比较

p[i] == p[next[next[i-1]];

可简化 取一个变量 k ,k = next[i-1];

k = next[k];p[i] == p[k];
最后直接给出求next数组的代码

int k = 0;int i = 1;while(p[i+1]) {if(p[i] == p[k]) {next[i++] = ++k;} else if(k > 0) {k = next[k];} else {               next[k++] = 0; 
     }
}

有了next数组后,一切变得简单了。
移动位数 = 已匹配的字符数 - 对应的部分匹配值
tar为源字符串,

for (i = 0; i < tarLen; i++) {if(p[j] && p[j] == tar[i]) {j++;break;}if (!p[j]) {printf("[%d]", i - j);//打印输出结果} else {j = next[j];if (j == 0) {break;}}}


怕以后又忘了。。。写篇博客。。记一下