Надо двигать концы отрезка: правый R и левый L. Изначально оба на нуле.
Держим текущий набор символов, чтобы проверять на повторы. Помним найденный максимальный отрезок.
Двигаем правый конец на 1. Если символа нет в наборе, добавляем. Если есть, двигаем L вправо за найденный символ. Перед этим проверяем, а не нашли ли мы очередной максимум.
Очень кривая спать-хочу реализация, вроде, работает:
IdeoneСтарый ответ, please ignore: Двигаться по одному символу. Помнить найденную макс. длину. Сравнивать символ с предыдущим.
Равен – длина текущего сегмента растёт.
Не равен – закончился предыдущий сегмент и начался новый. Если длина больше найденного максимума – найден очередной кандидат. Запомнить его длину и начало. Запомнить начало очередного сегмента и считать длину с 1.
Итого один раз пройтись. Не надо регулярок.