为 KMP 构建部分匹配表时:
void buildBackTable() {
int i = 0, j = -1; b[0] = -1;
while (i < m) {
while (j >= 0 && P[i] != P[j]) j = b[j]; //Why is this a while loop!?
i++; j++;
b[i] = j;
}
}
为什么第二个 while 循环不是有条件的呢?如:
void buildBackTable() {
int i = 0, j = -1; b[0] = -1;
while (i < m) {
if (j >= 0 && P[i] != P[j]) j = b[j]; //Why not?
i++; j++;
b[i] = j;
}
}
在我尝试过的大多数示例中,此语句用于在不匹配时将 j 重置为 -1,因此当下一次迭代到来时,我们将字符串的第一个字符 (P[j]) 与该字符进行比较在位置 i (P[i])。