Я не хочу не соглашаться с Майком и его сторонниками, но деревья суффиксов (структура данных описана в его ссылке) - это большая боль в реализации.И найти надежную реализацию в Pascal / Delphi тоже может быть сложно.
Суффиксные массивы предлагают ту же функциональность, хотя и намного проще.Компромисс составляет O(m * logn)
сложность, где m
- длина поискового токена, а n
- размер набора данных (в данном случае 100 КБ).
Если кто-то не знает, оба суффиксадеревья и суффиксные массивы позволяют найти все вхождения подстроки s
в длинном тексте t
.
Проблема Фернандо может быть уменьшена до этой, путем объединения начального набора строк в одну строку с использованием некоторого символа-разделителя.Например, исходный набор равен ["text1", "text2", "some text"]
, тогда строка результата t
будет "text1|text2|some text"
.
Теперь вместо поиска строки "text"
в каждом слове отдельно, нам просто нужно найти все вхождения этого слова.в большой строке t
.
Я также рекомендую Oren ответ, где он предлагает другой реалистичный подход.