Анаграммы
Порядок разный, состав одинаковый
Две строки являются анаграммами, если они состоят из одинакового количества одинаковых символов, но эти символы могут стоять в другом порядке. Поэтому сравнивать позиции напрямую бессмысленно: важно сравнить частоты.
Если задача гарантирует строчные английские буквы, достаточно массива из 26 счётчиков. Сначала увеличим частоты по первой строке, затем уменьшим их по второй.
static boolean areAnagrams(String first, String second) {
if (first.length() != second.length()) {
return false;
}
int[] frequency = new int[26];
for (int i = 0; i < first.length(); i++) {
frequency[first.charAt(i) - 'a']++;
frequency[second.charAt(i) - 'a']--;
}
for (int count : frequency) {
if (count != 0) {
return false;
}
}
return true;
}
Если строки имеют разный состав, хотя бы один счётчик останется ненулевым. Алгоритм выполняет линейное число действий — O(n), а дополнительная память для фиксированного алфавита остаётся O(1).
Другие ограничения — другая структура
Когда допустимые символы не ограничены буквами a-z,
тот же принцип можно реализовать через HashMap.
Альтернативный путь — отсортировать обе последовательности символов и сравнить результат,
но это обычно требует O(n log n) времени вместо линейного подсчёта частот.
Сначала уточни правила сравнения
Строки "Dormitory" и "Dirty room"
станут анаграммами только если условие разрешает игнорировать регистр и пробелы.
Такая нормализация — часть требований задачи, а не свойство анаграммы само по себе.