非优化版:
求的是前后缀最大匹配值,一般用于求最小循环节
求最小循环节:
设字符串为S,长度为n
循环节长度len = n - next[n];
(1)如果n可以被len整除 那说明S完全由循环节组成,循环周期为 n/len
(2)如果不能,说明还需要添加几个字母才可以补全
需要添加的个数为:len - n %len
void getnext(char s[], int nex[],int len)
{
int j = 0, k = -1;
nex[0] = -1;
while(j < len)
{
while(k != -1 && s[j] != s[k])
k = nex[k];
nex[++j] = ++k;
}
}
优化版:
一般与KMP算法一块用与求字符串位置,在运用KMP时,使用第二种算法,因为避免了多余的判断,更加高效
void getNext(char s[],int nex[],int len)
{
nex[0] = -1;
int k = -1;
for(int q = 1;q <= len; q ++)
{
while(k > -1 && s[k+1] != s[q])
k = nex[k];
if(s[k+1] == s[q])
k ++;
nex[q] = k;
}
}