Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boyer-Moore算法的正确实现_C++_C_Algorithm - Fatal编程技术网

C++ Boyer-Moore算法的正确实现

C++ Boyer-Moore算法的正确实现,c++,c,algorithm,C++,C,Algorithm,我尝试使用几个实现,但都有bug。 搜索SO给了我-看起来不错,但这个实现给了我错误的结果-有时它找不到字符串。 我花了几个小时才找到那个虫子 下面这行看起来不错: j += MAX(bmGs[i], bmBc[y[i + j]] - m + 1 + i); 但是y是char*,char是有符号的!这意味着y[i+j]可能为负值(在我的一次测试中发生的情况) 我的问题是:在哪里可以找到Boyer-Moore算法的正确实现?您尝试过吗 或者?字符没有确定签名或未签名-它是未指定的,由实现来定义

我尝试使用几个实现,但都有bug。
搜索SO给了我-看起来不错,但这个实现给了我错误的结果-有时它找不到字符串。
我花了几个小时才找到那个虫子

下面这行看起来不错:

j += MAX(bmGs[i], bmBc[y[i + j]] - m + 1 + i);
但是y是char*,char是有符号的!这意味着y[i+j]可能为负值(在我的一次测试中发生的情况)

我的问题是:在哪里可以找到Boyer-Moore算法的正确实现?

您尝试过吗


或者?

字符
没有确定签名或未签名-它是未指定的,由实现来定义


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

从C++17开始,这是内置在STL中的。就用吧。例如:

#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;
}
#包括
#包括
#包括
int main()
{
std::string haystack=“敏捷的棕色狐狸跳过了懒狗”;
std::string needle=“棕色”;
const auto s=std::boyer_moore_search(needle.begin(),needle.end());
const auto it=std::search(haystack.begin(),haystack.end(),s);
返回0;
}

FYI,《字符串算法之王》是丹·古斯菲尔德的书:《字符串、树和序列的算法》。@圣·贾辛托:你应该把你的评论作为答案——这本书真的很好!