Есть несколько способов ее решить.
Метод 1 - Использование функции пользовательского хеш-кода
У нас может быть функция hashCode, например:
static int[] primes = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103};
static String alphabet = "abcdefghijklmnopqrstuvwxyz";
public static int hashCode(String s){
int sum = 0;
for(char c: s.toCharArray()){
sum += primes[c-97];
}
return sum;
}
Генерирует хэш обеих строк, и, если хэш-код совпадает, строки являются анаграммами. Этот метод похож на решение, упомянутое Джином, так как он в некотором роде генерирует hashCode для строки.
Временная сложность - O (n)
Метод 2 - Использование хэш-карты символов и целых чисел
Рассмотрим 2 строки как 2 массива символов. Пройдите по первому массиву, добавьте символ в hashmap из char и count, увеличивайте количество, когда вы найдете символ. Аналогичным образом просмотрите второй массив, уменьшите счетчик в хэш-карте или, если вы не нашли символ, они не являются анаграммами. Наконец, когда карта содержит все символы и считается как 0, тогда снова 2 строки являются анаграммами.
Метод 3 - Использовать массив count (мой любимый)
<code>
boolean are_anagrams(string1, string2){
let counts = new int[26];
for each char c in lower_case(string1)
counts[(int)c]++
for each char c in lower_case(string2)
counts[(int)c]--
for each int count in counts
if count != 0
return false
return true
}
Вы можете получить все коды
здесь .