文字列 S を保持し、次のことを可能にするデータ構造を必要とする問題に遭遇しました。
- 単語 W が S のサブワードかどうかを O(|W|) 時間でチェックする
- 与えられた単語 U のプレフィックスでもある S の最長のサフィックスを O(|U|) 時間で見つけます
- O(|K|) 時間で S の末尾に文字列 K を追加します
Ukkonen アルゴリズムによって構築された接尾辞ツリーが探しているものであることがわかりました。アルゴリズムは「接尾辞ツリーのオンライン構築」として説明されており、「オンライン」部分に問題があります。各文字アルゴリズムの挿入後、最終ステップで明示的に変換できる暗黙的な接尾辞ツリーを構築します。しかし、そのステップの前に暗黙的なツリーを検索に使用したい場合はどうすればよいでしょうか? 「オンライン」は、分析された文字列のプレフィックスを挿入した後に可能であることを示唆していますが、暗黙的なツリーで動作する最も単純なアルゴリズムの例さえ見つかりません。
私の質問は次のとおりです。暗黙の接尾辞ツリーで文字列を検索するにはどうすればよいですか?
編集:私は私の問題を解決する非常に良い答えを受け入れましたが、その間に私は2へのより簡単な解決策を見つけることができました:長さ|U|のSの接尾辞でUを検索するだけで十分です KMP アルゴリズムを使用し、最後に一致した文字数は文字列の重複になります。