KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,它可以在一个文本字符串(Text)中搜索一个词(Pattern),时间复杂度为O(n+m),其中n是文本字符串的长度,m是词的长度。下面是一个C#实现KMP算法的示例:
using System;public class KMPAlgorithm
{// KMP算法中的部分匹配表(也称为失效函数或跳转表)private static int[] ComputeLPSArray(string pattern, int M, int[] lps){int len = 0; // 长度初始化int i = 1;lps[0] = 0; // lps[0] 总是0// 填充lps[]数组while (i < M){if (pattern[i] == pattern[len]){len++;lps[i] = len;i++;}else{// (pattern[i] != pattern[len])if (len != 0){len = lps[len - 1];// 不要遗漏这个// 否则,你可能会在以下情况中得到错误的答案// AAACAAAA 和 AAA}else{lps[i] = 0;i++;}}}return lps;}// KMP搜索算法public static int KMPSearch(string pat, string txt){int M = pat.Length;int N = txt.Length;// 创建lps[]数组,大小为M,并初始化为0int[] lps = new int[M];// 预处理填充lps[]ComputeLPSArray(pat, M, lps);int j = 0; // 用于pat[]的索引int i = 0; // 用于txt[]的索引while (i < N){if (pat[j] == txt[i]){j++;i++;}if (j == M){// 找到模式Console.WriteLine("Found pattern at index " + (i - j));return i - j; // 返回第一个匹配的位置// 如果我们想要找到所有匹配,我们可以注释掉这行代码并改为继续搜索}// 不匹配时else if (i < N && pat[j] != txt[i]){// 不要回溯iif (j != 0){j = lps[j - 1];}else{i = i + 1;}}}// 没有找到模式return -1;}// 示例用法public static void Main(){string txt = "ABABDABACDABABCABAB";string pat = "ABABCABAB";int result = KMPSearch(pat, txt);if (result == -1){Console.WriteLine("Pattern not found");}}
}
在这个示例中,ComputeLPSArray
方法计算了词(Pattern)的部分匹配表(LPS数组),而 KMPSearch
方法实现了KMP搜索算法,它使用LPS数组来避免不必要的字符比较。
在 Main
方法中,我们定义了一个文本字符串 txt
和一个词 pat
,然后调用 KMPSearch
方法来查找词在文本中的第一个出现位置。如果找到了,它会打印出该位置;否则,它会打印出“Pattern not found”。