直接上代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace dotnetKMP
{
class Program
{
public static int[] strNext;//失效函数值
static void Main(string[] args)
{
const string strForTest = "abaabcac";
const string strForAim = "abaabcac";
SetNext(strForTest);
int i = KMP(strForAim, strForTest);
Console.Read();
}
/// <summary>
/// 对输入串进行失效匹配初始化
/// </summary>
public static void SetNext( string inputStr)
{
int strLen = inputStr.Length;
strNext = new int[strLen];
int i = 0, j = -1;
strNext[0] = -1;
while(i<strLen)
{
if (j == -1 || inputStr[i] == inputStr[j])
{
i++;
if (i >= strLen)
break;
j++;
strNext[i] = j;
}
else
{
j = strNext[j];
}
}
}
/// <summary>
/// KMP算法实现 输出输入串在目标串中的起始位置 没有则输出-1
/// </summary>
/// <param name="aimStr">目标串</param>
/// <param name="testStr">输入串</param>
public static int KMP(string aimStr,string testStr)
{
int i = 0, j = 0;
while(i< aimStr.Length&&j < testStr.Length)
{
if(j==-1)
{
i++;
j = 0;
}
else if(aimStr[i] == testStr[j])
{
i++;
j++;
}
else
{
j = strNext[j];
}
}
if (j < testStr.Length)
{
return -1;
}
else
return i - j;
}
}
}