您的位置:首页 > 其它

字符串匹配之KMP算法

2013-08-30 23:58 267 查看
线性时间的字符串匹配算法。

比较长的一篇讲述KMP的博客:http://www.cnblogs.com/rollenholt/articles/2070664.html

/* kmp.c
* string matcher
*/
#include <stdio.h>
#include <stdlib.h>
int szl_strlen (const char * str){
return ('\0' == * str) ? 0 : (1 + szl_strlen (1 + str));
}

int * kmp_prefix_function (int * dest, const char * pattern){
int m = szl_strlen (pattern);
int k = 0;
int q;
* dest = 0;
for (q=1; q<m; q++){
while (0 < k && pattern[k+1] != pattern[q])
k = dest[k-1];
if (pattern[k+1] == pattern[q])
k = k + 1;
dest[q] = k;
}
}

int kmp (const char * text, const char * pattern){
int n = szl_strlen (text);
int m = szl_strlen (pattern);
int * pi = (int *) malloc (sizeof (int) * m);
int i,q;

kmp_prefix_function (pi, pattern);
q = 0;
for (i=0; i<n; i++){
while (0<q && text[i] != pattern[q])
q = pi[q-1];
if (text[i] == pattern[q])
q = q + 1;
if (q == m){
printf ("%d position occurs.\n", i+2-m);
q = pi[q-1];
}
}
free (pi);
}

int main (int argc, char * argv[] ){
char * t = "abababababcab";
char * s = "abab";
kmp (t, s);
return 0;
}


1 position occurs.
3 position occurs.
5 position occurs.
7 position occurs.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: