誰かが以前にこれを解決したに違いないが、私の検索は空になっている。
各単語の開始位置と長さを追跡しながら、単語のリストをバッファーにパックしたいと思います。秘訣は、冗長性を排除してバッファを効率的にパックしたいということです。
例:人形のドールハウスの家
これらは、位置0から始まる4文字、0で9文字、3で5文字でdollhouse
あることを思い出して、単純にバッファにパックできます。doll
dollhouse
house
私がこれまでに思いついたのは:
- 単語を最も長いものから最も短いものに並べ替えます:(ドールハウス、家、人形)
- バッファをスキャンして、文字列がサブ文字列としてすでに存在するかどうかを確認します。存在する場合は、場所をメモします。
- まだ存在しない場合は、バッファの最後に追加します。
長い単語には短い単語が含まれていることが多いため、これはかなりうまく機能しますが、大幅に改善できるはずです。たとえば、単語リストを拡張してラグドールを含めると、私のアルゴリズムは。dollhouseragdoll
よりも効率が悪くなりragdollhouse
ます。
これは前処理のステップなので、速度についてはそれほど心配していません。O(n ^ 2)で問題ありません。一方、私の実際のリストには数万の単語が含まれているため、O(n!)はおそらく問題外です。
ちなみに、このストレージスキームは、TrueTypeフォントの「name」テーブルのデータに使用されます。http://www.microsoft.com/typography/otspec/name.htm