Longest Substring Without Repeating Characters
Найдите в строке последовательности идущих подряд символов, в которых каждый символ встречается только один раз. В coddycode последовательность ycode содержит пять разных символов, и ни одна более длинная последовательность не обходится без повторов, поэтому ответ — 5.
Проверка всех возможных последовательностей работает, но выполняется медленно. Более быстрый способ поддерживает окно между двумя позициями, в котором символы никогда не повторяются. Передвигайте правую границу на один символ за раз. Когда новый символ уже находится в окне, передвиньте левую границу сразу за место, где этот символ встречался раньше. Если запоминать последнюю позицию каждого символа, такое перемещение выполняется мгновенно, поэтому строка считывается только один раз.
Напишите функцию с именем lengthOfLongestSubstring, которая получает строку s и возвращает длину самой длинной подстроки (последовательности идущих подряд символов), в которой ни один символ не встречается более одного раза.
Заглавные и строчные буквы — это разные символы, поэтому a и A не считаются повтором.
Ограничения: 1 <= s.length <= 5 * 10^4. s содержит только английские буквы (строчные и заглавные) и цифры.
Функция
- arg1string
- Возвращаетinteger
Примеры
- Ввод
- arg1 = "coddycode"
- Вывод
- 5
- Ввод
- arg1 = "racecar"
- Вывод
- 4
- Ввод
- arg1 = "a1b2a3b"
- Вывод
- 5
+12 скрытых тестов при отправке
Подсказки
Открывайте по одной. Каждая подсказывает чуть больше.
Подстрока — это непрерывная часть строки, поэтому нужно найти самый длинный фрагмент, который можно охватить, не встретив один и тот же символ дважды.
Поддерживай окно с левой и правой границами. Расширяй его справа на один символ за раз и перемещай левую границу только тогда, когда новый символ уже находится внутри окна.
Сохраняйте последний индекс, на котором встречался каждый символ. Если новый символ встречался в последний раз на индексе, равном левой границе или находящемся правее неё, переместите левую границу на одну позицию дальше этого индекса. Левая граница никогда не перемещается назад, а ответ — самое широкое окно, которое у вас когда-либо было.
Полный разбор этой задачи скоро появится.
Похожие задачи
Задачи на те же идеи. Решите две или три, и приём запомнится.
Python
def lengthOfLongestSubstring(s):
# Напишите код здесьСлучай 1
Случай 2
Случай 3
Ввод
arg1 = "coddycode"
Ожидается
5