Проверка повторяющихся символов в строке

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>.