Du solltest für der Optimierung nicht bei der Implementierung ansetzen, sondern beim Algorithmus..! Ein schlecht implementierter Quicksort ist immer noch um Größenordnungen schneller als ein perfekt implementiert und hochoptimierter Bubblesort - und so ähnlich ist es hier auch.
Daher werfe ich einfach mal
Suffix-Trees in die Runde. Ist zwar sicher etwas mehr Implementierungsaufwand, aber dafür baust du diese genau einmal auf (in linearer Zeit) und kannst dann in ebenfalls linearer Zeit darin suchen!
Gruß, Motzi