假设我们有3个字符串:"ab", "cd" and "ef"
。
让我们假设我们想要搜索的子串是上述字符串的排列,
即any of {"abcdef","abefcd","efabcd","efcdab","cdefab","cdabcf"}
现在让我们假设我们有一个很长的字符串,我们想从上面的集合中找到任何一个子字符串(简化案例并假设主串中只有一个子串出现一次)。
例如。在字符串中有效查找任何一组子字符串
Main string: abcdghefcdabgh
Substring: efcdab
这种情况下搜索的最有效方法是什么?使用暴力和搜索每个可能的子字符串是非常低效的。
Rabin-Karp进行多重模式搜索是我想到的一种方法。不过,我不确定在这种情况下会有一个非常有效的散列函数。
有什么问题由[百科]中描述的拉宾,卡普滚动散列(http://en.wikipedia.org/wiki/ Rolling_hash)? –
对于您描述的特定情况,检查所需长度的搜索字符串的每个子字符串(对于搜索字符串长度为n的搜索字符串有O(n))似乎并不是很有效,并查看它是否是目标串。如果目标字符串集合很小,可以在O(m)(其中m是目标字符串的数量)中构建一个哈希表...否则,你可以构造某种搜索树或其他东西。我不知道你怎么认为你可以做得比O(n + m)更好......如果这件事失去了一些显而易见的事情,那么抱歉我会变得密集。 – Patrick87
@robmayoff很好,它没有错。我只想知道是否有更好的方法,我错过了:) – eku