Проверка, являются ли две строки анаграммами

Сравните частоты символов двух строк. Для общего Unicode-варианта удобно считать code points, а не ограничиваться массивом из 26 букв; регистр и пробелы считаются значимыми.

Короткий ответ

Что ответить на собеседовании

Сравните частоты символов двух строк. Для общего Unicode-варианта удобно считать code points, а не ограничиваться массивом из 26 букв; регистр и пробелы считаются значимыми.

Подробный разбор

Ответ с пояснениями

Условие

Даны две строки str1 и str2. Необходимо вернуть true, если строка str2 представляет собой анаграмму строки str1, иначе – false.

Примеры: str1 = "anagram", str2 = "nagaram" → true str1 = "rat", str2 = "car" → false

class Solution {
    public boolean isAnagram(String str1, String str2) {
        // TODO
    }
}

Ответ

Сравните частоты символов двух строк. Для общего Unicode-варианта удобно считать code points, а не ограничиваться массивом из 26 букв; регистр и пробелы считаются значимыми.

public boolean isAnagram(String a, String b) {
    java.util.Objects.requireNonNull(a);
    java.util.Objects.requireNonNull(b);
    java.util.Map<Integer, Integer> counts = new java.util.HashMap<>();
    a.codePoints().forEach(c -> counts.merge(c, 1, Integer::sum));
    b.codePoints().forEach(c -> counts.merge(c, -1, Integer::sum));
    return counts.values().stream().allMatch(n -> n == 0);
}

Ожидаемое время O(n+m), память O(k) для разных символов. Пустые строки — анаграммы. Unicode-нормализация здесь не выполняется: визуально одинаковые, но по-разному закодированные последовательности могут отличаться.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее