请高手解释一下KMP算法。(如何实现字符串匹配)
请高手解释一下KMP算法。(如何实现字符串匹配)
KMP算法是一种用于字符串匹配的算法,这个算法的高效之处在于当在某个位置匹配不成功的时候可以根据之前的匹配结果从模式字符串的另一个位置开始,而不必从头开始匹配字符串.
因此这个算法的关键在于,当某个位置的匹配不成功的时候,应该从模式字符串的哪一个位置开始新的比较.假设这个值存放在一个next数组中,其中next数组中的元素满足这个条件:next[j] = k,表示的是当模式字符串中的第j + 1个(这里是遵守标准C语言中数组元素从0开始的约定,以下不再说明)发生匹配不成功的情况时,应该从模式字符串的第k + 1个字符开始新的匹配.如果已经得到了模式字符串的next数组,那么KMP算法的实现如下:
int i, j;
for (i = pos, j = 0; i < S->length && j < T->length; )
{
// i是主串游标,j是模式串游标
if (-1 == j || // 模式串游标已经回退到第一个位置
S->str[i] == T->str[j]) // 当前字符匹配成功
{
// 满足以上两种情况时两个游标都要向前进一步
++i;
++j;
}
else // 匹配不成功,模式串游标回退到当前字符的next值
{
j = next[j];
}
}
if (j >= T->length)
{
// 匹配成功
return i - T->length;
}
else
{
// 匹配不成功
return -1;
}