http://marknelson.us/1996/08/01/suffix-trees/のサイトに基づいてJavaでサフィックスツリーを構築しましたが、問題が発生しました。接尾辞ツリーをうまく構築することはできますが、ツリーからすべての接尾辞のセットを構築しようとすることはできます。基本的にすべての「エンドノード」を見つけて、その「エンドノード」で表される文字列を返します
そのアルゴリズムは「簿記係」のような単語に対して機能します
├── (1) bookkeeper
├── (9) e
│ ├── (8) eper
│ ├── (10) per
│ └── (12) r
├── (6) k
│ ├── (7) eeper
│ └── (5) keeper
├── (3) o
│ ├── (4) kkeeper
│ └── (2) okkeeper
├── (11) per
└── (13) r
接尾辞:
[bookkeeper, ookkeeper, okkeeper, kkeeper, keeper, eeper, eper, er, per, r]
でも「ATATATATATA」みたいなものを使うと失敗します
├── (1) ATATATATATA
└── (2) TATATATATA
接尾辞:
[ATATATATATA, TATATATATA]
ただし、適切なサフィックスは次のようになります。
[A, ATA, ATATA, ATATATA, ATATATATA, ATATATATATA, TA, TATA, TATATA, TATATATA, TATATATATA]
各「エンドノード」文字列のすべてのサフィックスを見つけることで答えを見つけることができますが、それは正しいアプローチのようには思えません。他に何か提案はありますか?
編集:izomorphiusに感謝します!元の文字列にEND_CHARを追加すると、非常に役立ちました。
├── (21) #
├── (19) A
│ ├── (20) #
│ └── (15) TA
│ ├── (16) #
│ └── (11) TA
│ ├── (12) #
│ └── (7) TA
│ ├── (8) #
│ └── (3) TA
│ ├── (4) #
│ └── (1) TA#
└── (17) TA
├── (18) #
└── (13) TA
├── (14) #
└── (9) TA
├── (10) #
└── (5) TA
├── (6) #
└── (2) TA#
接尾辞:
[A, ATA, ATATA, ATATATA, ATATATATA, ATATATATATA, TA, TATA, TATATA, TATATATA, TATATATATA]