KMP算法的主要思想是通过求模式串的next数组降低字符串匹配暴力算法的时间复杂度,其中next数组为字符串该字符的前缀数组,通过前缀数组可以减少在字符串不匹配时从头开始比较的次数,通过获取此前已知的匹配信息而减少再匹配时的时间。但是建立next数组需要占用一定内存,因此KMP算法也是用空间换时间的算法。
KMP算法的具体代码如下:
void getnext(string t, int next[])
{
int k = -1;
int j = 0;
next[0] = -1;
while (j < t.length()-1)
{
if (k == -1 || t[j] = t[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int KMP(string s, string t)
{
int m = s.length();
int n = t.length();
int* next;
getnext(t, next);
int i = 0, j = 0;
while (m < s.length()&&n<t.length())
{
if (s[i] == t[j]||j==-1)
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j >= m) { return i - n; }
else
{
return -1;
}
}