ハッシュを使用します。マルチセット内の各文字に対して、UNIQUE 素数を割り当てます。数値に関連付けられた素数をその数値の頻度と同じ回数掛けて、任意の文字列のハッシュを計算します。
例:CATTA。C = 2、A=3、T = 5 とする。ハッシュ = 2*3*5*5*3 = 450
マルチセットをハッシュします (文字列として扱います)。次に、入力文字列を調べて、長さ k の各部分文字列のハッシュを計算します (ここで、k は multiset 内の文字数です)。このハッシュがマルチセット ハッシュと一致するかどうかを確認します。はいの場合、それはそのような出来事の 1 つです。
ハッシュは、次のように線形時間で非常に簡単に計算できます。
multiset = { A, A, B, C }、A=2、B=3、C=5 とします。
マルチセット ハッシュ = 2*2*3*5 = 60
text = CABBAACCA とする
(i) CABB = 5*2*3*3 = 90
(ii) さて、次の文字は A で、破棄された文字は最初の文字 C です。したがって、新しいハッシュ = ( 90/5 )*2 = 36
(iii) ここで、A が破棄され、A も追加されるため、新しいハッシュ = ( 36/2 ) * 2= 36
(iv) ここで B が破棄され、C が追加されるため、ハッシュ = ( 36/3 ) * 5 = 60 = マルチセット ハッシュ。したがって、必要なオカレンスの 1 つ、BAAC が見つかりました。
この手順は明らかに O( n ) 時間かかります。