Horspool算法用于多次出现相同模式

时间:2012-05-13 13:47:31

标签: c++ string

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

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

我在main()函数的主体中尝试了以下内容,但它虽然有效,但效率不高。如果遇到第一次出现的图案,将打印其位置,并且将删除以第一次出现的图案结束的文本部分。此外,程序将检查模式的剩余文本等。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

目前,您始终从头开始(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;
}