kmp场景:寻找子串
kmp算法即在查找子串时考虑子串本身是否有重复的元素,如abcabc,节省重复check重复元素的时间``
关键词:前缀、后缀(一个字符是没有前后缀的;前后缀不包括本身)
pmt:当前位置的字串,它的前缀和后缀完全一样的个数
next:pmt向右移动一格,第一个位置置-1
求next的代码
void getNext(char * p, int * next)
{
next[0] = -1;
int i = 0, j = -1;
while (i < (int)strlen(p))
{
if (j == -1 || p[i] == p[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}
完整的代码
int KMP(char * t, char * p)
{
int i = 0;
int j = 0;
while (i < (int)strlen(t) && j < (int)strlen(p))
{
if (j == -1 || t[i] == p[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == strlen(p))
return i - j;
else
return -1;
}
参考链接:https://www.zhihu.com/question/21923021/answer/281346746 作者:海纳