📜  用于模式搜索的 KMP 算法的 C 程序(1)

📅  最后修改于: 2023-12-03 14:56:21.744000             🧑  作者: Mango

用于模式搜索的 KMP 算法的 C 程序

KMP 是一种用于字符串匹配的算法,其中 KMP 代表 Knuth-Morris-Pratt。此算法的主要思想是在不回溯文本字符串的情况下有效搜索模式字符串。

实现过程

KMP 算法的实现思路如下:

  1. 先根据模式串构建一个部分匹配表(Partial Match Table,PMT)。
  2. 从文本串第一个字符开始,同时从模式串的第一个字符开始匹配。
  3. 如果匹配成功,则继续匹配下一个字符,否则通过 PMT 来找到模式串中的下一个字符位置并继续匹配,直到匹配成功或者整个文本串匹配完毕。
代码实现

下面是用 C 语言实现 KMP 算法的代码片段:

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

void preProcess(char *pat, int M, int *lps) {
    int len = 0;
    lps[0] = 0;
    int i = 1;
    while (i < M) {
        if (pat[i] == pat[len]) {
            len++;
            lps[i] = len;
            i++;
        } else {
            if (len != 0) {
                len = lps[len - 1];
            } else {
                lps[i] = 0;
                i++;
            }
        }
    }
}

void KMP(char *pat, char *txt) {
    int M = strlen(pat);
    int N = strlen(txt);
    int lps[M];
    preProcess(pat, M, lps);
    int i = 0, j = 0;
    while (i < N) {
        if (pat[j] == txt[i]) {
            j++;
            i++;
        }
        if (j == M) {
            printf("Found pattern at index %d\n", i - j);
            j = lps[j - 1];
        } else if (i < N && pat[j] != txt[i]) {
            if (j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }
}

int main() {
    char *txt = "ABABDABACDABABCABAB";
    char *pat = "ABABCABAB";
    KMP(pat, txt);
    return 0;
}

上述代码实现了 KMP 算法的核心部分。其中,preProcess()函数用于构建 PMT 表,KMP()函数则是用于搜索匹配的核心代码片段。

总结

KMP 算法是一种高效的字符串匹配算法,在实际应用中被广泛使用。了解和实现 KMP 算法对于 C 语言程序员来说是非常重要的技能。