KMP:
目标:查询字符串 str2 是否是 str1 的子串。
说明: i 表示 str1 的下标, j 表示 str2 的下标
分析: 1. str2 的长度应该小于等于 str1 的长度,既 str1.Length >= str2.Length 。
2. 从 str2 的第一个( str2[j=0] )开始和 str1 第 i 个( str1[i] )匹配,如果相等,则匹配下一个;如果不匹配, str1 回溯到 i – j + 1 , str2 应该回溯到开始 j=0 。
优化:只要循环 str1.Length – str2.Length 就可以了,因为后面的长度比 str2 的长度短了
实现:
static void KMP()
{
string[] str1 = new string[]{"v", "0", "w", "e", "b", "a", "g", "s", "d", "p", "p", "w", "e"};
string[] str2 = new string[]{"w", "e", "b", "a"};
int i = 0;
int j = 0;
// KMP 核心算法
while( i < str1.Length-str2.Length && j < str2.Length )
{
if (str1[i].Equals(str2[j])) // 逐个匹配,如果匹配成功对应的 index 加一
{
i++;
j++;
}
Else // 如果失匹,应该回溯
{
i = i - j + 1 ; // str1 的 index 应该回溯到开始的下一位
j = 0; // str2 的 index 应该回溯到开始
}
}
if (j >= str2.Length) // 匹配成功
Console.Out.WriteLine("Matches: index is " + (i -j));
else
Console.Out.WriteLine("Not match");
}