您的位置:首页 > 其它

字符串匹配KMP算法

2014-04-18 20:19 337 查看
详细算法描述见《算法导论32.4》,以下是C实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//预处理:所需时间为O(m),空间O(m)
void compute_prefix_func(char sp[], int p[])
{
int m, k, q;
m = strlen(sp);
p[0] = 0;
k = 0;
for (q = 1; q < m; q++) {
while ((k > 0) && (sp[k] != sp[q])) {
k = p[k-1];
}
if (sp[k] == sp[q])
k++;
p[q] = k;
}

for (q = 0; q < m; q++)
printf("p[%d] = %d\n", q, p[q]);
}

//匹配:所需时间为O(n)
void kmp_matcher(char st[], char sp[])
{
int n, m, q, i;
int *p;
n = strlen(st);
m = strlen(sp);
p = (int *)malloc(sizeof(int) * m);
compute_prefix_func(sp, p);
q = 0; //Number of characters matched
for (i = 0; i < n; i++) {
while ((q > 0) && (sp[q] != st[i])) {
q = p[q-1]; //Next character does not match
}
if (sp[q] == st[i]) //Next character matches
q++;
if (q == m) { //Is all of P matched?
printf("Pattern occurs with shift %d\n", i - (m - 1));
q = p[q-1]; //Look for the next match
}
}
free(p);
}

int main(void)
{
char st[] = "abcdabcabcabcabcdabcabcdabcabcabcd";
char sp[] = "abcabcd";
kmp_matcher(st, sp);
return 1;
}


KMP算法图文解析

KMP算法详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: