Сложность: medium
Вам дана строка s длины n, содержащая только четыре вида символов: 'Q', 'W', 'E' и 'R'. Строка считается сбалансированной, если каждый из ее символов встречается n / 4 раз, где n - длина строки. Верните минимальную длину подстроки, которую можно заменить любой другой строкой той же длины, чтобы сделать s сбалансированной. Если s уже сбалансирована, верните 0.
Пример:
Input: s = "QWER"
Output: 0
👨💻 Алгоритм:
1⃣Проверка баланса:
Сначала проверим, сбалансирована ли строка s. Если да, то возвращаем 0.
2⃣Подсчет частоты символов:
Подсчитаем количество каждого символа в строке s.
3⃣Использование скользящего окна:
Используем метод двух указателей (скользящее окно) для нахождения минимальной подстроки, которую можно заменить, чтобы строка стала сбалансированной.
Начнем с окна, которое захватывает всю строку, и будем постепенно уменьшать его, проверяя при каждом шаге, становится ли строка сбалансированной.
😎 Решение:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int balancedString(String s) {
int n = s.length();
Map<Character, Integer> count = new HashMap<>();
for (char c : s.toCharArray()) {
count.put(c, count.getOrDefault(c, 0) + 1);
}
int target = n / 4;
boolean isBalanced() {
return count.getOrDefault('Q', 0) <= target &&
count.getOrDefault('W', 0) <= target &&
count.getOrDefault('E', 0) <= target &&
count.getOrDefault('R', 0) <= target;
}
if (isBalanced()) return 0;
int minLength = n;
int left = 0;
for (int right = 0; right < n; right++) {
count.put(s.charAt(right), count.get(s.charAt(right)) - 1);
while (isBalanced()) {
minLength = Math.min(minLength, right - left + 1);
count.put(s.charAt(left), count.get(s.charAt(left)) + 1);
left++;
}
}
return minLength;
}
}
Ставь 👍 и забирай 📚 Базу знаний