kmp算法,就是模式串匹配算法,但又不同于BF算法的。它和BF算法之间的最大区别在于,kmp算法在匹配前会对目标串进行一定的处理。会用到一个next数组用来存放,在匹配时第i个字符失配时应将目标串移动多少位。而第i个字符的next值时由前i-1个字符组成的字符串决定的。因为,第i个字符的next值是前i-1个字符组成的字符串的最大的相同前缀与后缀的字符数之和,所以next[0]=-1。在匹配的过程中,模式串中的指针不会回溯,而目标串中的指针的回溯是根据第i个失配字符的next值所决定的。
求next函数的模板
void get_next(char T[], int next[])
{
// 求模式串T的next函数值并存入数组 next。
j = 0; next[0] = -1; k = -1;
while ( T[j+1] != ' ' ) {
if (k = = -1 || T[j] = = T[k])
{ ++j; ++k; next[j] = k; }
else k = next[k];
}
} // get_next
因为在S[i]和T[j]不等时,由于T[j]=T[k],则S[i]肯定也不等于T[k],也就是说,S[i]不应该再去和T[k]进行比较(因为纯粹是多余的),而应该直接和T[next[k]]进行比较。因此,当T[j]=T[k]时,应该直接取T[k]的next函数值作为T[j]的 next 函数值。
void get_nextval(char T[], int next[])
{
// 求模式串T的next函数值并存入数组 next。
j = 0; next[0] = -1; k = -1;
while ( T[j+1] != ' ' ) {
if (k = = -1 || T[j] = = T[k]) {
++j; ++k;
if (T[j]!=T[k]) next[j] = k;
else next[j] = next[k];
} // if
else k = next[k];
} // while
} // get_nextval
kmp比较函数
while(i<len_a&&j<len_b)
{
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
j=next[j];
}