【发布时间】:2013-01-18 01:00:25
【问题描述】:
我正在尝试从字符串 text 中找到一个子字符串,它是字符串 pattern 的变位词。
我的问题: 可以将Rabin-Karp algorithm 调整为此目的吗?还是有更好的算法?
我尝试了一种蛮力算法,但在我的情况下它不起作用,因为文本和模式都可以达到一百万个字符。
更新:我听说有一个使用 O(1) 空间的最坏情况 O(n2) 算法。有谁知道这个算法是什么?
更新 2: 作为参考,这里是 Rabin-Karp 算法的伪代码:
function RabinKarp(string s[1..n], string sub[1..m])
hsub := hash(sub[1..m]); hs := hash(s[1..m])
for i from 1 to n-m+1
if hs = hsub
if s[i..i+m-1] = sub
return i
hs := hash(s[i+1..i+m])
return not found
这使用滚动散列函数来计算 O(1) 中的新散列,
所以在最坏的情况下,整体搜索是 O(nm),但是在最好的情况下,一个好的散列函数是 O(m + n)。在搜索字符串的字谜时,是否有一个滚动哈希函数会产生few collisions?
【问题讨论】:
-
你的暴力破解算法是什么?
-
只需遍历每个文本子字符串,将每个子字符串与 O(n^2) 中的模式进行比较!所以总数是 O(n^3) ,
-
你的“字母”是什么?真的是 A-Z,还是更大的一组符号?
-
@erickson:它只是小写的 a-z 字母,
-
我添加了一个更详细的关于滚动字谜散列的描述,它会产生很少的错误冲突。
标签: c++ string algorithm hash anagram