string - 有效地查找字符串中的一组子字符串中的任何一个

标签 string algorithm substring

假设我们有 3 个字符串:"ab"、"cd"和 "ef"
假设我们要搜索的子字符串是上述字符串的排列,
{"abcdef","abefcd","efabcd","efcdab","cdefab","cdabcf”
现在让我们假设我们有一个长字符串,我们想从上面的集合中找到任何一个子字符串(稍微简化一下,假设主字符串中只有一个子字符串出现一次).
例如。

Main string: abcdghefcdabgh
Substring:         efcdab

在这种情况下,进行搜索的最有效方法是什么?进行蛮力搜索每个可能的子串是非常低效的。
用于多模式搜索的 Rabin-Karp 是我想到的一种方法。但是我不确定在那种情况下会是一个非常有效的哈希函数。

最佳答案

搜索任何“ab”,在 +1 或 -1 处找到“cd”或“ef”,继续直到找到整个排列。

例子:

使用 “ab”、“cd”、“ef”
"asjkdnjdnaboidnabefcdasdnmk"

"ab" 的第一个实例位于 9,因此:

lowerFound = 9
upperfound = 11 \\ found index + length of found string

从那里你知道排列中的任何其他匹配必须在 lowerfound 之前或在 upperfound 之上,因此在这个例子中看两边:
dn ab oi 不包含任何匹配项,因此丢弃并在 15

处找到下一个 "ab"
lowerFound = 15
upperfound = 17
search for "cd" or "ef" at 15-length or 17
found "ab"+"ef"

lowerFound = 15
upperfound = 19
search for "cd" at 15-length or 19
found "abef"+"cd"

return

我已经制定了一个程序来执行此操作,但它非常大,按行计算,所以我将其放在 right here 中。 , 请随意批评这种方法。
为了减少最坏的情况"ababababababababcdef",您可能希望在内存中保留已搜索的索引。

关于string - 有效地查找字符串中的一组子字符串中的任何一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962479/

相关文章:

java - 关于推荐引擎

双引号之间的 JavaScript 文本

c - 默认情况下,读取输入缓冲区中的哪个字符会使 scanf() 停止读取字符串?

java - Android Java - 字符串中的字符串变量?

ruby - 在 Ruby 中循环遍历一个字符串

c# - 旋转表迭代

java - 电话号码字符串到 int

regex - 使用正则表达式查找任意长度的连续 block

mysql - 在 MySQL 中拆分逗号分隔值

c - 在较大的字符串中查找子字符串的第一个字符的位置