KMP算法(串的模式匹配)原理及其C实现

  KMP算法是由Knuth、Morris、Pratt三个人共同提出的串的模式匹配算法,常规的模式匹配算法通常需要O(m*n)的时间复杂度,而KMP算法只有O(m+n)的时间复杂度
  在串的模式匹配中有两个串,待匹配串String和模式串Pattern,KMP算法是通过先对模式串进行分析,建立一个match函数来管理模式串中的重复子串。
m a t c h = { p 0 . . . p i = p k . . . p j i ( < j ) 1 i match=\begin{cases} 满足p_0...p_i = p_k...p_j的最大i(<j)\\ -1,如果这样的i不存在\\ \end{cases}
用C语言实现KMP代码如下所示:

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
 
typedef int Position;
#define NotFound -1
 
void BuildMatch( char *pattern, int *match )
{
    Position i, j;
    int m = strlen(pattern);
    match[0] = -1;
     
    for ( j=1; j<m; j++ ) {
        i = match[j-1];
        while ( (i>=0) && (pattern[i+1]!=pattern[j]) )
            i = match[i];
        if ( pattern[i+1]==pattern[j] )
             match[j] = i+1;
        else match[j] = -1;
    }
}
 
Position KMP( char *string, char *pattern )
{
    int n = strlen(string);
    int m = strlen(pattern);
    Position s, p, *match;
     
    if ( n < m ) return NotFound;
    match = (Position *)malloc(sizeof(Position) * m);
    BuildMatch(pattern, match);
    s = p = 0;
    while ( s<n && p<m ) {
        if ( string[s]==pattern[p] ) {
            s++; p++;
        }
        else if (p>0) p = match[p-1]+1;
        else s++;
    }
    return ( p==m )? (s-m) : NotFound;
}
 
int main()
{
    char string[] = "This is a simple example.";
    char pattern[] = "simple";
    Position p = KMP(string, pattern);
    if (p==NotFound) printf("Not Found.\n");
    else printf("%s\n", string+p);
    return 0;  
}
发布了5 篇原创文章 · 获赞 4 · 访问量 616

猜你喜欢

转载自blog.csdn.net/qq_40268412/article/details/104512018