KMP字符串匹配算法及C语言实现

上学时早就接触过KMP算法了,但当时比较浮躁总是一知半解,最近下了狠心研究了一下,也在网上看了不少介绍KMP算法的帖子,总感觉有些人有故弄玄虚之嫌,直到我看到下面这个链接中的博文之后终于茅塞顿开,讲的非常浅显易懂,在此向博主表示由衷的感谢,连接贴出,希望大家可以从中受益。

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

连接里介绍的KMP算法非常浅显易懂,本人就不再班门弄斧了,直接贴出代码吧

#include 
#include 

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));
} 

你可能感兴趣的:(C语言编程)