代码显示在此处:http://www-igm.univ-mlv.fr/~lecroq/string/node14.html
我的问题是函数void preBmGs(char *x, int m, int bmGs[])
为了更好的阅读,我粘贴下面的功能:
void preBmGs(char *x, int m, int bmGs[]) {
int i, j, suff[XSIZE];
suffixes(x, m, suff);
for (i = 0; i < m; ++i)
bmGs[i] = m;
j = 0;
for (i = m - 1; i >= 0; --i)
if (suff[i] == i + 1)
for (; j < m - 1 - i; ++j)
if (bmGs[j] == m) //--here is my question, remove it, is ok ? --
bmGs[j] = m - 1 - i;
for (i = 0; i <= m - 2; ++i)
bmGs[m - 1 - suff[i]] = m - 1 - i;
}
我的理由是:j
是增量的,所以j
肯定不会回来。
我阅读了很多关于BM的博客,但他们的代码都包含if (bmGs[j] == m)
。
答案 0 :(得分:0)
我认为你是对的。它没有意义,因为bmGs []被初始化为m,范围为m,直到语句为止
if (bmGs[j] == m)
bmGs数组未被修改。并且没有理由使用bmGs[j] == m
因为它总是等于m总是在(m)的范围内,并且两个for循环都在有效范围内。