Используйте скользящее окно и Map последних позиций символов. При повторе переносите начало окна вправо за предыдущую позицию символа и обновляйте максимальную длину.
Максимальная длина подстроки без повторяющихся символов
Используйте скользящее окно и Map последних позиций символов. При повторе переносите начало окна вправо за предыдущую позицию символа и обновляйте максимальную длину.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вам предоставлена строка s. Требуется определить длину наибольшего непрерывного фрагмента этой строки, в котором каждый символ встречается только один раз. Пример: Input: s = "abcabcbb" Output: 3
Ответ
Используйте скользящее окно и Map последних позиций символов. При повторе переносите начало окна вправо за предыдущую позицию символа и обновляйте максимальную длину.
static int longestUnique(String s) {
var last = new java.util.HashMap<Character, Integer>();
int start = 0, maximum = 0;
for (int end = 0; end < s.length(); end++) {
Integer old = last.put(s.charAt(end), end);
if (old != null) start = Math.max(start, old + 1);
maximum = Math.max(maximum, end - start + 1);
}
return maximum;
}
Для abcabcbb ответ 3. Ожидаемое время O(n), память O(k). Max не позволяет левой границе уйти назад. Символ и длина здесь определяются через UTF-16 char, что нужно отдельно изменить для требований по Unicode code points.