我已经基于此处的网站构建了一个基于Java的后缀树http://marknelson.us/1996/08/01/suffix-trees/但我遇到了问题。我可以建立一个后缀树,但我可以尝试从树中构建一组所有后缀。我基本上找到所有的“端节点”和由“末端节点”返回的表示字符串从后缀树生成后缀
该算法适用于一个字,如“会计”
├── (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]
看起来你的树没有完成'ATATATATATA'。 – Howard 2012-04-09 13:53:27