Сравните частоты символов двух строк. Для общего 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-нормализация здесь не выполняется: визуально одинаковые, но по-разному закодированные последовательности могут отличаться.