上学时早就接触过KMP算法了,但当时比较浮躁总是一知半解,最近下了狠心研究了一下,也在网上看了不少介绍KMP算法的帖子,总感觉有些人有故弄玄虚之嫌,直到我看到下面这个链接中的博文之后终于茅塞顿开,讲的非常浅显易懂,在此向博主表示由衷的感谢,连接贴出,希望大家可以从中受益。
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
连接里介绍的KMP算法非常浅显易懂,本人就不再班门弄斧了,直接贴出代码吧
#include <stdio.h>
#include <string.h>
void cal_next(char * str, int * next)
{
for (char * ptr = str; *ptr; ptr++)
{
int j = ptr - str;
while (j && strncmp(str, ptr + 1 - j, j))
j--;
next[ptr - str] = j;
}
}
char * strkmp(char * src, char * dst)
{
int next[128] = {0};
cal_next(dst, next);
int len = strlen(dst), cur_len;
char * psrc = src, * pdst = dst;
while (*psrc)
{
if (*psrc - *dst && psrc++ || (cur_len = 0))
continue;
while (pdst[cur_len] && psrc[cur_len] == pdst[cur_len])
cur_len++;
if (cur_len == len)
break;
psrc += cur_len - next[cur_len - 1];
}
return *psrc ? psrc : NULL;
}
int main()
{
char src[] = "ABC ABCDAB ABCDABCDABDE";
char dst[] = "ABCDABD";
printf("SRC %s\n", dst);
printf("MAT %s\n", strkmp(src,dst));
}