正确实施Boyer Moore算法

时间:2010-07-14 23:52:11

标签: c++ c algorithm

我尝试使用多个实现,但所有实现都有错误 在SO搜索给了我http://www-igm.univ-mlv.fr/~lecroq/string/node14.html - 看起来很不错,但是这个实现给了我错误的结果 - 有时它找不到字符串。
我花了几个小时来找到这个bug。

以下行看起来很好:

j += MAX(bmGs[i], bmBc[y[i + j]] - m + 1 + i);

y 是char *,char是签名!这意味着y [i + j]可能是负面的(在我的一个测试中会发生什么)。

我的问题是:在哪里找到正确实施的Boyer Moore算法?

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

char未明确签名未签名 - 未指定,并留给要定义的实现。

如果算法依赖于char是无符号的,那么它应该显式地将输入指针强制转换为unsigned char(这是C标准库字符串处理函数定义为工作的方式 - 所有的比较都是在处理字符时完成的字符串为unsigned char)。

答案 2 :(得分:1)

从C ++ 17开始,它内置在STL中。只需使用std::boyer_moore_searcher。例如:

#include <algorithm>
#include <string>
#include <functional>

int main()
{
    std::string haystack = "The quick brown fox jumped over the lazy dog";
    std::string needle = "brown";
    const auto s = std::boyer_moore_searcher<std::string::iterator>(needle.begin(), needle.end());
    const auto it = std::search(haystack.begin(), haystack.end(), s);
    return 0;
}