在计算 next 数组的值时,我们需要从前往后遍历模式串,对于每个位置 i,我们尝试从 i-1 开始向前搜索最长的匹配前缀。我们可以使用变量 j 来表示前一个字符的位置,从而得到以下算法:
next[i] = 0 // i=0 时,next[0]=0 j = next[i-1] // j 表示前一个字符的位置 while(j>0 && s[i]!=s[j]) // 如果前缀不匹配,则继续向前搜索 j = next[j-1] if(s[i]==s[j]) // 如果前缀匹配,则当前字符匹配的前缀长度为 j+1 j++ next[i] = j
对于模式串 "abcdabcdab