Используйте хеширование. Для каждого символа в мультимножестве присвойте УНИКАЛЬНОЕ простое число. Вычислите хеш для любой строки, умножив простое число, связанное с числом, на столько раз, сколько частота этого числа.
Пример: CATTA. Пусть C = 2, A = 3, T = 5. Хеш = 2 * 3 * 5 * 5 * 3 = 450
Хэш мультимножества (трактуйте его как строку). Теперь просмотрите входную строку и вычислите хэш каждой подстроки длины k (где k - количество символов в мультимножестве). Проверьте, совпадает ли этот хеш с хешом мультимножества. Если да, то это один из таких случаев.
Хеши могут быть очень легко вычислены за линейное время следующим образом:
Пусть мультимножество = {A, A, B, C}, A = 2, B = 3, C = 5.
Хэш мультисети = 2 * 2 * 3 * 5 = 60
Пусть текст = CABBAACCA
(i) CABB = 5 * 2 * 3 * 3 = 90
(ii) Теперь следующая буква - А, а отброшенная буква - первая, С. Итак, новый хэш = (90/5) * 2 = 36
(iii) Теперь A отбрасывается и A также добавляется, поэтому новый хэш = (36/2) * 2 = 36
(iv) Теперь B отбрасывается, а C добавляется, поэтому hash = (36/3) * 5 = 60 = multi-set hash. Таким образом, мы нашли один такой требуемый случай - BAAC
Эта процедура, очевидно, займет O (n) время.