假設我們有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