我正在研究KMP算法。尽管这个算法很容易理解,但我在这里有一个疑问。
前缀表算法:
void prefixTable(char p[], int m){
int i=1, j=0, F[0] = 0;
while(i<m){
if(p[i]==p[j]){
F[i]=j+1;
i++;
j++;
}else if(j>0){
j=F[j-1];
}else{
F[i]=0;
i++;
}
}
}

如上面的图像步骤5所示,i=5,j=3,j=Fj-1作为j>0执行.
为什么我们要用Fj-1?为什么我们不能直接使用F呢?如何保证算法的正确性?
发布于 2016-08-16 19:41:54
J是模式中的位置。
如果模式被处理到某个位置> 0,那么如果模式包含其本身的前缀,则不能将模式移动到第一个(0)位置。
应用于您的示例:模式是ababaca。尝试在文本abababaca中找到它
ababa|baca的ababa|c为止。|ababac,这永远不会与baca匹配(请注意,我不会被更改)aba|bac,这将与baca匹配ababac|中,文本位于状态abababac|a中,很明显,找到的模式是ab[ababac]a。https://stackoverflow.com/questions/38982121
复制相似问题