我已经在C++中实现了Horspool算法(取决于Anany Levitin的《算法设计和分析算法简介》,第二版,第258页),以查找文本中所需模式第一次出现的位置。但是,我想扩展算法以查找同一模式的多次出现。不幸的是,我坚持使用后者。您可以在下面看到我的代码:

该函数计算并返回文本中第一次出现所需模式的位置。移位大小存储在ShiftTable中,并且ShiftTable由所需字母的字符索引。此外,整数计数器用于计数模式字符和文本字符之间的总比较。计数器最初为零。我如何扩展它以查找同一模式的多次出现?

我在main()函数的主体中尝试了以下操作,但是虽然有效,但是效率不高。如果遇到图案的第一次出现,则将打印其位置,并且将删除以图案的第一次出现结尾的文本部分。此外,程序将检查剩余的文本以查找图案,依此类推。

int counter=0;
while ((position = Find(pattern,text,ShiftTable,counter)) != -1) {
    cout << position << endl;
    text = text.erase(0,result+m);
}

有任何想法吗?

最佳答案

当前,您总是从头开始(i = m - 1)。如果要恢复先前的搜索,只需传递最后一个位置即可开始。

在下面的内容中,我删除了counter变量-到底有什么用?

int Find(string pattern, string text, int *ShiftTable, int start = 0)

……和……
i = start + m - 1,

…并按如下所示调用代码:
while ((position = Find(pattern,text,ShiftTable,position)) != -1)  {
    cout << position << endl;
    ++position;
}

关于c++ - 多次出现相同模式的Horspool算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10572270/

10-09 17:14