先放get_nextval()函数的代码
void get_nextval(const char str[],int *net)
{
net[0]=-1;
int j=0,k=-1,len;
len=strlen(str);
while(j<len)
{
if(k==-1||str[j]==str[k])
net[++j]=++k;
else
k=net[k];
}
}//在这个函数内数组下标是0开始的
在这个函数内数组下标是0开始的
首先你要明白next数组的含义
next[j]的意思就是在下标j之前的字符串上 得出该字符串大的最大匹配数
就像这样
要求k最大即匹配数最多(两条黑线内的对应相等)(图不好先凑合一下 有时间找大牛给补下图)
好的 现在咱们开始分析get_next函数
next[0]=-1(代表没有最大匹配 应该将i指针右移动)
假设next[j]=k成立 且0<=k<j (k!=j保证最大匹配数不为自己本身)
1.如果str[j]==str[k]的话str[j+1]=k+1
因为如果还存在str[j+1]>k+1的话即 str[j]>k 这与假设不成立 所以 str[j+1]=k+1