KMP 为字符串的匹配算法,主要定义了一个next数组来实现匹配的跳转
本文章主要讲讲next数组的含义以及求法
next[i]表示以当前第i个字符为结尾的匹配长度
如:
0 1 2 3 4 5 6 7 8 9
a b a b c a b a b
0 0 1 2 0 1 2 3 4 next[i]
void makenext()
{
int i=0;
int j=-1;
next[0]=-1;
int len=s.length();
while(i<len)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
next数组可以用来求重复子串的长度
(1)i - next[i] 最小循环节(第一个字母开始)
(2)next[i] 最大循环节中的第几位数(此时循环节可交叉)
(3)next[i] != 0 && i % (i - next[i]) == 0,当前是循环节中的最 后一位.
(4)在(3)的前提下 i / (i - next[i]) 表示的最大周期个数,也就是在最小循环节的前提下的最大周期个数。