Строки являются перестановками друг друга, если для каждого символа совпадает число вхождений. Одного сравнения множеств символов недостаточно: оно теряет повторы.
Проверка, являются ли две строки взаимными перестановками
Строки являются перестановками друг друга, если для каждого символа совпадает число вхождений. Одного сравнения множеств символов недостаточно: оно теряет повторы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая получает две строки и определяет, представляют ли они собой одинаковый набор символов, то есть являются ли они перестановками друг друга. Функция должна вернуть true, если строки являются перестановками, и false — в противном случае.
Ответ
Строки являются перестановками друг друга, если для каждого символа совпадает число вхождений. Одного сравнения множеств символов недостаточно: оно теряет повторы.
static boolean isPermutation(String a, String b) {
java.util.Objects.requireNonNull(a);
java.util.Objects.requireNonNull(b);
var counts = new java.util.HashMap<Integer, Integer>();
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 code points. Регистр, пробелы и пунктуация значимы; нормализация Unicode не выполняется. Например, aab и abb не являются перестановками, хотя множества букв у них одинаковы.