Подход к решению одного из типов задания 24.
Обобщенная формулировка задачи.
- Есть последовательность элементов/символов.
- Определено понятие слова, причем слова могут "пересекаться", но не совпадать
- Необходимо найти длину наименьшей/наибольшей подпоследовательности, содержащей
заданное количество слов (ровно/не более/не менее)
Для решения используем метод двухуказателей:
- Левый указатель(ll, ii) устанавливаем на начало слова
- Правый указатель (rr, jj) на окончание слова (следующий за словом)
Понятие слова определяется следующим образом:
- Слово - это то, что находится между НАЧАЛОМ/СТАРТОМ слова и КОНЦОМ/ФИНАЛОМ слова
- НАЧАЛО слова нужно определять исходя из условия задания. Примеры
- начало строки или буква после пробела (стандартное)
- цифра, после которой идет буква
- буква, после которой идет цифра
- символ из допустимого набора (цифры 1, 2. ..., 9)
- КОНЕЦ слова определяется из условия задания. Примеры
- буква перед пробелом или последний символ строки
- буква, после которой идет цифра
- цифра, после которой идет буква
- разрешенный символ, после которого идет запрещенный в слове символ
Определить "индексы окончания" для всех слов (и их количество N
R).
- Индексы записать и IR - словарь/список (ключ номер слова)
Решение с помощью обычного цикла по строке!!!
- Аналогично для "индексов начала", получить NL и IL
- Вывести/сравнить NR и NL - они должны "совпадать" (при условии, что "индекс начала" первого слова меньше "индекса Финала" первого слова и аналогично для последних слов)
Это определенная проверка правильности решения пунктов 1,2
- В цикле по i от 1 до NL выполняем :
- находим j - номер "финального" слова (i + k - 1), где k - требуемое количество слов
- если j-е слово "ЕСТЬ", то находим длину последовательности и обрабатываем её
Достоинства подхода
- Задача разбивается на несколько "технических" этапов, резализуемых с помощью циклов
- Для каждого этапа возможна "простая независимая проверка"
- Есть дополнительная проверка по количеству индексов "Начало слова", "Финал слова"
Недостатки
- два прохода по последовательносит (1 и 2 этап можно объединить)
- желательно "посмотреть" начало и окончание последовательности, чтобы оценить начало/окончание последовательности перебора для 1-2 этапов (или придется автоматизировать этот процесс)
- использование дополнительной памяти для хранение индексов, но если понимать, что можно обойтись без хранение всей строки, то этот аргумент теряет актуальность
Практически, реализован метод "двух указателей", разделенный на пару проходов.
Назовем такой способ "упрощенным методом двух указателей"
Для демонстрации способа, разберем поэтапное решение задачи из Статграда (декабрь 2025 года)