您的位置:首页 > 编程语言 > C#

字符串匹配的KMP算法详解及C#实现

2013-08-09 11:38 429 查看
字符串匹配是计算机的基本任务之一。

  举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。

这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。

1.

private static int KmpIndexOf(string s, string t)
{
int i = 0, j = 0, v;
int[] nextVal = GetNextVal(t);

while (i < s.Length && j < t.Length)
{
if (j == -1 || s[i] == t[j])
{
i++;
j++;
}
else
{
j = nextVal[j];
}
}

if (j >= t.Length)
v = i - t.Length;
else
v = -1;

return v;
}

private static int[] GetNextVal(string t)
{
int j = 0, k = -1;
int[] nextVal = new int[t.Length];

nextVal[0] = -1;

while (j < t.Length - 1)
{
if (k == -1 || t[j] == t[k])
{
j++;
k++;
if (t[j] != t[k])
{
nextVal[j] = k;
}
else
{
nextVal[j] = nextVal[k];
}
}
else
{
k = nextVal[k];
}
}

return nextVal;
}


View Code

这种实现比我上面的实现,性能要高出三倍,原因在与,它生成“Next特征数组”(网上有资料这么叫的)只用了一个循环,而我的用了三个循环,貌似最后那个数组值也不一样,没看懂他的思路是怎么回事,如有懂的,请指点下,谢谢!测试代码下载:http://files.cnblogs.com/joey0210/ArithmeticSolution.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: