Suffix Tree Algorithm implemented in Python, might be the most complete version online, even more complete than that demonstrated on stackoverflow.
I underestimated the complication of the algorithm and just wanted to have some fun. A primitive implementation was done in a couple of hours, and the demonstation example on stackoverflow works just fine. Then when I wanted try some more complicated examples, I kept hitting the wall time and time again. It annoyed me, and thus costed me several days to try different situations when constructing a suffix tree.
Finally, the version comes out, I think all the situations explained in the questions and answers have been experienced and covered in the algorithm above before I read the full post.
I also write a blog on explaining the implementation details on my blogger MuTuX with flowcharts and explanation on it.
docs = ['abcabxabcd', 'dedododeeodoeodooedeeododooodoede$', 'ooooooooo', 'mississippi']
for text in docs:
tree, pst = build(text, regularize=True)
Node.draw(tree, pst, ed='#')
The running results:
abcabxabcd
β (0)
|
| ab
+----------------β (4->6)
| |
| | xabcd
| +---------------β (5)
| |
| | c
| +---------------β (9->11)
| |
| | abxabcd
| +---------------β (1)
| |
| | d
| +---------------β (10)
|
| c
+----------------β (13)
| |
| | abxabcd
| +---------------β (3)
| |
| | d
| +---------------β (14)
|
| b
+----------------β (6)
| |
| | xabcd
| +---------------β (7)
| |
| | c
| +---------------β (11->13)
| |
| | abxabcd
| +---------------β (2)
| |
| | d
| +---------------β (12)
|
| xabcd
+----------------β (8)
|
| d
+----------------β (15)
dedododeeodoeodooedeeododooodoede$
β (0)
|
| e
+----------------------------------------β (28)
| |
| | $
| +---------------------------------------β (71)
| |
| | eodo
| +---------------------------------------β (48->37)
| |
| | eodooedeeododooodoede$
| +---------------------------------------β (29)
| |
| | dooodoede$
| +---------------------------------------β (49)
| |
| | d
| +---------------------------------------β (44->19)
| |
| | ododeeodoeodooedeeododooodoede$
| +---------------------------------------β (18)
| |
| | e
| +---------------------------------------β (68->26)
| |
| | eododooodoede$
| +---------------------------------------β (45)
| |
| | $
| +---------------------------------------β (69)
| |
| | odo
| +---------------------------------------β (37->31)
| |
| | eodooedeeododooodoede$
| +---------------------------------------β (30)
| |
| | dooodoede$
| +---------------------------------------β (50)
| |
| | oedeeododooodoede$
| +---------------------------------------β (38)
|
| d
+----------------------------------------β (19)
| |
| | e
| +---------------------------------------β (26->28)
| |
| | dododeeodoeodooedeeododooodoede$
| +---------------------------------------β (17)
| |
| | $
| +---------------------------------------β (70)
| |
| | eodo
| +---------------------------------------β (46->48)
| |
| | eodooedeeododooodoede$
| +---------------------------------------β (27)
| |
| | dooodoede$
| +---------------------------------------β (47)
| |
| | o
| +---------------------------------------β (33->35)
| |
| | e
| +---------------------------------------β (64->42)
| |
| | de$
| +---------------------------------------β (65)
| |
| | odooedeeododooodoede$
| +---------------------------------------β (34)
| |
| | d
| +---------------------------------------β (22->24)
| |
| | eeodoeodooedeeododooodoede$
| +---------------------------------------β (23)
| |
| | o
| +---------------------------------------β (53->31)
| |
| | deeodoeodooedeeododooodoede$
| +---------------------------------------β (20)
| |
| | oodoede$
| +---------------------------------------β (54)
| |
| | o
| +---------------------------------------β (57->59)
| |
| | edeeododooodoede$
| +---------------------------------------β (40)
| |
| | odoede$
| +---------------------------------------β (58)
|
| o
+----------------------------------------β (35)
| |
| | e
| +---------------------------------------β (42->28)
| |
| | odooedeeododooodoede$
| +---------------------------------------β (36)
| |
| | de
| +---------------------------------------β (66->68)
| |
| | eododooodoede$
| +---------------------------------------β (43)
| |
| | $
| +---------------------------------------β (67)
| |
| | d
| +---------------------------------------β (24->19)
| |
| | eeodoeodooedeeododooodoede$
| +---------------------------------------β (25)
| |
| | o
| +---------------------------------------β (31->33)
| |
| | e
| +---------------------------------------β (62->64)
| |
| | de$
| +---------------------------------------β (63)
| |
| | odooedeeododooodoede$
| +---------------------------------------β (32)
| |
| | d
| +---------------------------------------β (51->22)
| |
| | eeodoeodooedeeododooodoede$
| +---------------------------------------β (21)
| |
| | ooodoede$
| +---------------------------------------β (52)
| |
| | o
| +---------------------------------------β (55->57)
| |
| | edeeododooodoede$
| +---------------------------------------β (39)
| |
| | odoede$
| +---------------------------------------β (56)
| |
| | o
| +---------------------------------------β (59->35)
| |
| | edeeododooodoede$
| +---------------------------------------β (41)
| |
| | doede$
| +---------------------------------------β (61)
| |
| | odoede$
| +---------------------------------------β (60)
|
| $
+----------------------------------------β (72)
ooooooooo$
β (0)
|
| o
+----------------β (89)
| |
| | $
| +---------------β (90)
| |
| | o
| +---------------β (87->89)
| |
| | $
| +---------------β (88)
| |
| | o
| +---------------β (85->87)
| |
| | $
| +---------------β (86)
| |
| | o
| +---------------β (83->85)
| |
| | $
| +---------------β (84)
| |
| | o
| +---------------β (81->83)
| |
| | $
| +---------------β (82)
| |
| | o
| +---------------β (79->81)
| |
| | $
| +---------------β (80)
| |
| | o
| +---------------β (77->79)
| |
| | $
| +---------------β (78)
| |
| | o
| +---------------β (75->77)
| |
| | $
| +---------------β (76)
| |
| | o$
| +---------------β (74)
|
| $
+----------------β (91)
mississippi$
β (0)
|
| i
+------------------β (104)
| |
| | ppi$
| +-----------------β (105)
| |
| | $
| +-----------------β (109)
| |
| | ssi
| +-----------------β (98->100)
| |
| | ppi$
| +-----------------β (99)
| |
| | ssippi$
| +-----------------β (94)
|
| p
+------------------β (107)
| |
| | i$
| +-----------------β (108)
| |
| | pi$
| +-----------------β (106)
|
| s
+------------------β (96)
| |
| | i
| +-----------------β (102->104)
| |
| | ppi$
| +-----------------β (103)
| |
| | ssippi$
| +-----------------β (97)
| |
| | si
| +-----------------β (100->102)
| |
| | ppi$
| +-----------------β (101)
| |
| | ssippi$
| +-----------------β (95)
|
| mississippi$
+------------------β (93)
|
| $
+------------------β (110)
Have fun!