我尝试使用多个实现,但所有实现都有错误
在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算法?
答案 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;
}