text
文字列のアナグラムである文字列から部分文字列を見つけようとしていますpattern
。
私の質問: ラビン-カープアルゴリズムをこの目的に合わせて調整できますか?または、より良いアルゴリズムはありますか?
私はブルートフォースアルゴリズムを試しましたが、テキストとパターンはそれぞれ最大100万文字になる可能性があるため、私の場合は機能しませんでした。
更新: O(1)スペースを使用する最悪の場合のO(n 2)アルゴリズムがあると聞きました。誰かがこのアルゴリズムが何であるか知っていますか?
更新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
文字列のアナグラムを検索するときに生成されるローリングハッシュ関数はありますか?