最近、ツリーを使用して最長共通部分文字列の問題を解決する方法を学んでいます。Wiki やその他のオンライン リソースから学んだ後、サフィックス ツリーを使用して最長の共通部分文字列を見つける必要があることがわかりました。
ウィキが言ったように:
文字列の集合の最も長い共通部分文字列は、文字列の一般化されたサフィックス ツリーを構築し、その下のサブツリー内のすべての文字列から葉ノードを持つ最も深い内部ノードを見つけることによって見つけることができます。
ジャスティンが言ったように:
String = ABCDE$XABCZ$
End of word character 1 = $
└── (0)
├── (20) $
├── (22) ABC
│ ├── (15) DE$
│ └── (23) Z$
├── (24) BC
│ ├── (16) DE$
│ └── (25) Z$
├── (26) C
│ ├── (17) DE$
│ └── (27) Z$
├── (18) DE$
├── (19) E$
├── (21) XABCZ$
└── (28) Z$
(コンパクトな) サフィックス ツリーでは、すべての文字列からリーフ ノードを持つ最も深い内部ノードを見つける必要があります。同じ深さに複数のノードがある場合は、そのノードが表す文字列の長さを比較する必要があります。つまり、ABC、BC、C の深さはすべて同じなので、ABC、BC、C の文字列の長さを比較して、どちらが長いかを確認する必要があります。これは明らかにABCです。
ここで、すべての文字列から葉ノードを持つ最も深い内部ノードを見つけるプロセスは、実際にはすべての文字列からすべての接尾辞の中で最も長い共通の接頭辞を見つけるプロセスだと思いました。
ここで質問があります: すべての文字列のすべてのサフィックスを格納するプレフィックス ツリーを構築しないのはなぜですか? 次に、接頭辞ツリーを検索して、これらの接尾辞の最も長い共通接頭辞を見つけることができます。この2つの違いはわかりません。この問題を解決するためにプレフィックス ツリーの代わりにサフィックス ツリーを使用する理由を誰かに教えてもらえますか?