[TestClass]
public class Kmptest
{
[TestMethod]
public void Go()
{
string t = "AABBCBBABBCACCD";
string s = "BBABBCAC";
var next = new int[s.Length];
Kmp(ref next, t, s);
}
public int Kmp(ref int[] next, string t, string s)
{
int lt = t.Length;
int ls = s.Length;
int i = 0, j = 0;
Get_Next(ref next, s);
while (i < lt && j < ls)
{
if (j == -1 || t[i] == s[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j >= ls)
{
return i + 1 - ls;
}
else
{
return -1;
}
}
public void Get_Next(ref int[] next, string s)
{
int ls = s.Length;
int i = 0, j = -1;
next[0] = -1;
while (i < ls-1)
{
if (j == -1 || s[i] == s[j])
{
j++;
i++;
if (s[i] == s[j])
{
next[i] = next[j];
}
else
{
next[i] = j;
}
}
else
{
j = next[j];
}
}
}
}