文字列がコレクション内の部分文字列と一致するかどうかを効率的に確認するにはどうすればよいですか


7

部分文字列のコレクションがあります

"this" "is" "a" "antelope"

与えられた文字列を見て、「この文字列に与えられた部分文字列はありますか」という質問に答える必要があります。

だから私の入力文字列は

"issue"

「is」は「issue」のサブストリングであるため、どちらが一致します

これを初めて試したところ、部分文字列のコレクションを誤ってトライに変えました。「入力文字列は与えられたコレクションの部分文字列である」と逆に答えたので、それは私をどこにも速くさせませんでした。

この質問に効率的に答えるためにコレクションを変換できるアルゴリズムまたはデータ構造はありますか?つまり、単純なブルートフォースの「すべての部分文字列に対して入力をチェックする」メソッドを実行できましたが、もっと良い方法があるようです。

私の与えられた例では、「a」がカモシカがするすべてのケースをカバーするので、「カモシカ」が決してチェックされないことを期待します。「is」は「this」を削除することを期待しているかもしれません。したがって、長い部分文字列を短い文字列で削除すると、パフォーマンスが向上するようです。

私はとりとめています...私が調べなければならないことはありますか?


標準の部分文字列検索アルゴリズム(Boyer-Mooreなど)を調べましたか?一致に到達するまで、コレクション内の各部分文字列を続けて検索できます。
James Evans

1
@ dirk5959単一文字列マッチングアルゴリズムを順番に使用すると、非常に非効率になります。たとえば、検索する文字列に "a"が含まれていない場合、確かに "banana"は含まれていませんが、とにかくそれを探します。
David Richerby、2015年

ヒント:サフィックスツリー。
ラファエル

回答:


6

ここではAho-Corasickアルゴリズムが最善の策だと思います。このアルゴリズムは、セットマッチング問題(基本的には定義したもの)を解決するように設計されています。この問題では、サブストリングのセットLのどの要素が長いストリングSで見つかるかを判断します。

時間で実行されます。ここで、(におけるサブストリングの合計の組み合わせた長さ)、 Sの長さであり、そしてのマッチの数であるで。O(n+m+z)n=lL|l|LmzLS

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.