18. Проверить, что символы строки повторяются не более двух раз
Условие задачи:
Дана непустая строка.
Необходимо проверить, что ни один символ в строке не встречается более двух раз.
Метод должен вернуть:
true— если каждый символ встречается не более двух раз;false— если хотя бы один символ встречается три раза или больше.
Примеры:
"aabbcc" → true
"aaabbc" → false
"abcabc" → true
Спойлеры к решению
Подсказки
💡 Для этого удобно использовать
HashMap.💡 Как только количество какого-либо символа становится больше двух, можно сразу вернуть
false.💡 Полностью обрабатывать строку после этого уже не требуется.
Решение
public static boolean validateString(String input) {
if (input == null || input.isEmpty()) {
throw new IllegalArgumentException(
"Строка не должна быть null или пустой"
);
}
Map<Character, Integer> frequencies = new HashMap<>();
for (char ch : input.toCharArray()) {
int count = frequencies.getOrDefault(ch, 0) + 1;
if (count > 2) {
return false;
}
frequencies.put(ch, count);
}
return true;
}
Для каждого символа определяется новое количество вхождений:
int count = frequencies.getOrDefault(ch, 0) + 1;
Если символ появился третий раз:
if (count > 2) {
return false;
}
метод сразу завершает работу.
Например, для строки:
aaabbc
обработка символа a будет выглядеть так:
a → 1
a → 2
a → 3 → false
Если строка полностью обработана и ни один символ не встретился более двух раз, возвращается:
return true;
Временная сложность в среднем — O(n), дополнительная память — O(k), где k — количество различных символов.
Если под «любыми символами» требуется корректная работа со всеми Unicode-кодпоинтами, включая символы за пределами BMP, вместо char следует обрабатывать input.codePoints() и хранить частоты в Map<Integer, Integer>.