kmp查找关键的地方首先是在next数组的创建
next数组创建:abababac为例
next数组第一位str[0]为next[0]=0,str[1]和str[0]不相同所以也为next[1]=0,str[2]动态规划先和str[1]比较,不相同,则比较str[1-1],相同故next[2]=1,str[3]和str[next[1]+1]比较相等则next[3]=next[2]+1=2,str[4]和str[next[2]+1]比较相等故next[4]=next[3]+1=3,next[5],next[6],next[7],同理各自加一,str[8]也就是str[next[7]+1]作比较,发现不相等则开始往前一位比较相等就加next就在前一位的基础上加一,不相等就继续往前。
下面上代码
void GetNext(char s[],int next[])
{
int len = strlen(s);
next[0]=0; //初始化next数组
for(int i=1,k=0;i<len;i++)
{
while(k>0 && s[k]!=s[i]) //这个while是最关键的部分
k=next[k-1];
//等价于 k=next[next[i-1]-1]
//等号右边的k起的只是下标的作用
if(s[k]==s[i])
k+