Сложность: medium
Вам дана строка s и целое число k. Вы можете выбрать любой символ строки и заменить его на любой другой заглавный английский символ. Вы можете выполнить эту операцию не более k раз.
Верните длину самой длинной подстроки, содержащей одну и ту же букву, которую можно получить после выполнения вышеуказанных операций.
Пример:
Input: s = "ABAB", k = 2
Output: 4
Explanation: Replace the two 'A's with two 'B's or vice versa.
👨💻 Алгоритм:
1⃣Определите диапазон поиска. Минимальная длина подстроки с одинаковыми символами всегда равна 1 (назовем ее min), а максимальная длина подстроки может быть равна длине данной строки (назовем ее max). Ответ будет лежать в диапазоне [min, max] (включительно).
2⃣Инициализируйте две переменные lo и hi для бинарного поиска. lo всегда указывает на длину допустимой строки, а hi - на недопустимую длину. Изначально lo равно 1, а hi равно max+1.
3⃣Выполните бинарный поиск, чтобы найти максимальное значение lo, которое представляет самую длинную допустимую подстроку. В конце lo будет содержать ответ, а hi будет на единицу больше lo.
😎 Решение:
public class Solution {
public int CharacterReplacement(string s, int k) {
int lo = 1;
int hi = s.Length + 1;
while (lo + 1 < hi) {
int mid = lo + (hi - lo) / 2;
if (CanMakeValidSubstring(s, mid, k)) {
lo = mid;
} else {
hi = mid;
}
}
return lo;
}
private bool CanMakeValidSubstring(string s, int substringLength, int k) {
int[] freqMap = new int[26];
int maxFrequency = 0;
int start = 0;
for (int end = 0; end < s.Length; end++) {
freqMap[s[end] - 'A']++;
if (end + 1 - start > substringLength) {
freqMap[s[start] - 'A']--;
start++;
}
maxFrequency = Math.Max(maxFrequency, freqMap[s[end] - 'A']);
if (substringLength - maxFrequency <= k) {
return true;
}
}
return false;
}
}Ставь 👍 и забирай 📚 Базу знаний