white_raven,
все просто и стандартно - ищем максимальный отрезок, для этого помним текущий наилучший результат, а в процессе обхода строки набираем отрезок-претендент.
Текущий максимум - в переменных maxStart и maxLength (начало и длина).
Претендент начинается с позиции start, его длина на каждой итерации равна (i - start).
В массиве map хранится последняя найденная позиция для каждой буквы. Процитированный тобой кусок - это когда на очередной итерации встретилась такая буква, которая уже есть в набираемом отрезке. Тогда прекращаем его набирать, смотрим, превзошел ли он максимум, если да, то сохраняем. И начинаем набирать новый отрезок со след. символа после найденной буквы.
Затраты по операциям - O(N), здесь меньше нельзя.
|