Для начала, да, вы можете сделать это с Бойер-Мур очень эффективно. Однако, в зависимости от некоторых других параметров вашей проблемы, может быть лучшее решение.
Алгоритм сопоставления строк Aho-Corasick найдет все вхождения набора строк шаблонов в целевой строке и сделает это за время O (м + n + z), где m - длина строки для поиска, n - общая длина всех сопоставляемых шаблонов, а z - общее количество найденных совпадений. Это линейный размер исходной и целевой строк, если у вас есть только одна строка для сопоставления. Он также найдет перекрывающиеся вхождения одной и той же строки. Более того, если вы хотите проверить, сколько раз набор строк появляется в некоторой исходной строке, вам нужно сделать только один вызов алгоритма. Кроме того, если набор строк, которые вы хотите найти, никогда не изменяется, вы можете выполнить O (n) как время предварительной обработки, а затем найти все совпадения в O (m + z).
Если, с другой стороны, у вас есть одна исходная строка и быстро меняющийся набор подстрок для поиска, вы можете использовать дерево суффиксов . С O (m) временем предварительной обработки строки, в которой вы будете искать, вы можете, за O (n) время на подстроку, проверить, сколько раз конкретная подстрока длины n появляется в строке.
Наконец, если вы ищете что-то, что вы можете легко и с минимальным трудом кодировать, вы можете рассмотреть алгоритм Рабина-Карпа , в котором используется Роллинг хеш-функция для поиска строк. Это может быть закодировано примерно в десяти-пятнадцати строках кода, не требует времени предварительной обработки, и для обычных текстовых строк (много текста с небольшим количеством совпадений) может очень быстро найти все совпадения.
Надеюсь, это поможет!