Показать сообщение отдельно
  #24 (permalink)  
Старый 17.02.2017, 18:48
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,010

white_raven,

все просто и стандартно - ищем максимальный отрезок, для этого помним текущий наилучший результат, а в процессе обхода строки набираем отрезок-претендент.

Текущий максимум - в переменных maxStart и maxLength (начало и длина).

Претендент начинается с позиции start, его длина на каждой итерации равна (i - start).

В массиве map хранится последняя найденная позиция для каждой буквы. Процитированный тобой кусок - это когда на очередной итерации встретилась такая буква, которая уже есть в набираемом отрезке. Тогда прекращаем его набирать, смотрим, превзошел ли он максимум, если да, то сохраняем. И начинаем набирать новый отрезок со след. символа после найденной буквы.

Затраты по операциям - O(N), здесь меньше нельзя.
Ответить с цитированием