KMP算法可以查找符合要求的字符串的索引。
在下面的代码中会打印出方法所消耗的时间。
一些异常的处理:
- 比如当word比longwrod还要长的时候异常处理
- longwrod或者word为空的时候异常处理
- 当word在longwrod中不存在的时候异常处理
csharp
static void Main(string[] args)
{
string longwrod = "112312er3338bluifaehilf";
string word = "3338";
DateTime beforDT = System.DateTime.Now;
TMPFunc(longwrod, word);
DateTime afterDT = System.DateTime.Now;
TimeSpan ts = afterDT.Subtract(beforDT);
Console.WriteLine("DateTime总共花费{0}ms.", ts.TotalMilliseconds);
}
/// <summary>
/// TMP算法_查找符合要求的字符串的索引
/// </summary>
/// <param name="longWord"> 长串</param>
/// <param name="word">字串</param>
public static void TMPFunc(string longWord, string word)
{
if (string.IsNullOrEmpty(longWord) || string.IsNullOrEmpty(word))
{
Console.WriteLine("长字符串和查找字符串不能为空。");
return;
}
if (word.Length > longWord.Length)
{
Console.WriteLine("查找字符串长度大于长字符串长度,无法匹配。");
return;
}
int[] prefixTable = CalculatePrefixTable(word);
int longWordIndex = 0;
int wordIndex = 0;
while (longWordIndex < longWord.Length)
{
if (longWord[longWordIndex] == word[wordIndex])
{
longWordIndex++;
wordIndex++;
if (wordIndex == word.Length)
{
// 找到了匹配
Console.WriteLine("匹配找到在索引 " + (longWordIndex - wordIndex));
wordIndex = prefixTable[wordIndex - 1];
}
}
else
{
if (wordIndex != 0)
{
wordIndex = prefixTable[wordIndex - 1];
}
else
{
longWordIndex++;
}
}
}
if (wordIndex == 0)
{
Console.WriteLine("未找到匹配。");
}
}
private static int[] CalculatePrefixTable(string word)
{
int[] prefixTable = new int[word.Length];
int prefixLength = 0;
int i = 1;
while (i < word.Length)
{
if (word[i] == word[prefixLength])
{
prefixLength++;
prefixTable[i] = prefixLength;
i++;
}
else
{
if (prefixLength != 0)
{
prefixLength = prefixTable[prefixLength - 1];
}
else
{
prefixTable[i] = 0;
i++;
}
}
}
return prefixTable;
}