参考文章:
获取特征向量数组next,第一个元素为-1.
void getNext(char *cStr, int *next)
{
int j = 0, k = -1;
next[0] = -1;
while ('\0' != cStr[j+1])
{
if (-1 == k || cStr[k] == cStr[j])
{
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
}
获取特征向量数组next,第一个元素为0.
void GetNext(char cStr[], int len, int next[])
{
next[0] = 0;
int temp;
for (int i = 1; i < len; i++)
{
temp = next[i - 1];
while (temp && cStr[temp] != cStr[i])
temp = next[temp - 1];
if (cStr[temp] == cStr[i])
next[i] = temp + 1;
else
next[i] = 0;
}
}
KMP模式匹配函数
int KMP(char t[], char p[])
{
int i = 0; // 主串的位置
int j = 0; // 模式串的位置
int tLen = strlen(t); // 主字符串t的长度
int pLen = strlen(p); // 模式串的长度
int *next = new int[pLen]; // 特征向量数组
getNext(p, next); // 获取特征向量数组
while (i < tLen && j < pLen)
{
if (j == -1 || t[i] == p[j])
{
// 当j为-1时,要移动的是i,当然j也要归0
i++;
j++;
}
else
{
// i不需要回溯了, i = i - j + 1;
j = next[j]; // j回到指定位置
}
}
delete []next;
if (j == pLen)
return i - j;
else
return -1;
}
其他链接:
KMP算法的前缀next数组最通俗的解释
KMP算法详解