Используйте скользящее окно: число замен равно длине окна минус максимальная частота буквы; сужайте окно, пока оно требует больше k замен.
LeetCode #424 — Дана строка из заглавных английских букв s и число k. За одну операцию можно заменить любой символ на другую заглавную букву. Верните длину самой длинной подстроки, которую можно сделать состоящей из одинаковых символов не более чем за k замен. Опишите решение и разбейте его на логические подзадачи.
Используйте скользящее окно: число замен равно длине окна минус максимальная частота буквы; сужайте окно, пока оно требует больше k замен.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Используйте скользящее окно: число замен равно длине окна минус максимальная частота буквы; сужайте окно, пока оно требует больше k замен.
Для английского алфавита пересчёт максимума по 26 счётчикам остаётся линейным:
function characterReplacement(s, k) {
const counts = Array(26).fill(0);
let left = 0, best = 0;
for (let right = 0; right < s.length; right++) {
counts[s.charCodeAt(right) - 65]++;
while (right - left + 1 - Math.max(...counts) > k) {
counts[s.charCodeAt(left++) - 65]--;
}
best = Math.max(best, right - left + 1);
}
return best;
}
Предполагаются заглавные A–Z и целое k≥0. Каждый указатель движется только вперёд: O(n) времени, O(1) дополнительной памяти.