以下是一个使用C#实现KMP算法的示例代码:
using System;
class KMPAlgorithm
{
public static int KMPSearch(string text, string pattern)
{
int n = text.Length;
int m = pattern.Length;
// 构建部分匹配表
int[] lps = new int[m];
ComputeLPSArray(pattern, m, lps);
// 在文本中搜索模式
int i = 0; // 文本指针
int j = 0; // 模式指针
while (i < n)
{
if (text[i] == pattern[j])
{
i++;
j++;
}
if ( == m)
{
return i - j; 找到匹配,返回匹配的起始位置
}
else if (i < n && text[i] != pattern[j])
{
if (j != 0)
j = lps[j - 1];
else
i++;
}
}
return -1; // 没有找到匹配
}
private static void ComputeLPSArray(string pattern, int m, int[] lps)
{
int len = 0; // 最长相等前后缀长度
int i = 1;
while (i < m)
{
if (pattern[i] == pattern[len])
{
len++;
lps[i] = len;
i++;
}
else
{
if (len != 0)
{
len = lps[len - 1];
}
else
{
lps[i] = 0;
i++;
}
}
}
}
static void Main(string[] args)
{
string text = "ABABDABACDABABCABAB";
string pattern = "ABABCABAB";
int index = KMPSearch(text, pattern);
if (index != -1)
{
Console.WriteLine("Pattern found at index " + index);
}
else
{
Console.WriteLine("Pattern not found");
}
}
}
在上述示例中,我们定义了一个KMPSearch方法来执行KMP搜索算法。该方法接受一个文本字符串和一个模式字符串,并返回模式在文本中的起始位置。如果找不到匹配,返回-1。
在KMPSearch方法中,我们首先构建了部分匹配表(lps数组),然后使用双指针i和j在文本中搜索模式。如果找到匹配,i和j同时向前移动;如果不匹配,根据部分匹配表调整j的位置。
在ComputeLPSArray方法中,我们计算了模式字符串的部分匹配表。该表保存了每个位置的最长相等前后缀的长度。
在Main方法中,我们使用示例文本和模式进行测试,并输出结果。
希望这个示例代码可以帮助您理解和使用KMP算法在C#中进行字符串匹配。如果您有其他问题,请随时提问。