Что это простой способ сказать, если список слов, которые являются анаграммами друг друга?
Как бы вы перечислили слова, которые являются анаграммами друг друга?
мне задали этот вопрос, когда я подал заявку на свою текущую работу.
orchestra можно переставить в carthorse со всеми оригинальными буквами, используемыми ровно один раз, поэтому слова являются анаграммами друг друга.
10 ответов
Поместите все буквы в алфавитном порядке в строку (алгоритм сортировки), а затем сравните полученную строку.
Адам
хорошо, что мы все живем в реальности c# сортировки на месте коротких слов на четырехъядерных машинах с сочится памяти. :-)
однако, если вы ограничены в памяти и не можете коснуться исходных данных, и вы знаете, что эти слова содержат символы из нижней половины таблицы ASCII, вы можете пойти на другой алгоритм, который подсчитывает появление каждой буквы в каждом слове вместо сортировки.
вы также можете выбрать этот алгоритм, если вы хотите сделать это в O (N) и не заботитесь об использовании памяти (счетчик для каждого символа Unicode может быть довольно дорогим).
сортировка каждого элемента (удаление пробелов) и сравнение с предыдущим. Если все они одинаковы, то это анаграммы.
интересно, что сказочные приключения Эрика Липперта в блоге кодирования разбирался с вариацией на эту самую проблему 4 февраля 2009 года в этот пост.
должен работать следующий алгоритм:
сортировка букв в каждом слове.
сортировка отсортированных списков букв в каждом списке.
сравниваем каждый элемент в каждом списке для равенства.
Ну сортировать слова в списке.
Если входами являются abc, bca, cab, cba, то отсортированным списком будет abc, abc, abc, abc.
теперь все их хэш-код равны. Сравните хэш-коды.
сортировка букв и сравнение (буква за буквой, строка сравнения, ...) это первое, что приходит на ум.
- сравнить длину (если не равно, не шанс)
 - сделайте битовый вектор длины строк
 - для каждого 
charв первой строке найти вхождения его во втором - установите бит для первого вхождения unset
 - Если вы можете найти одну остановку с ошибкой
 
public static void main(String[] args) {
    String s= "abc";
    String s1="cba";
     char[] aArr = s.toLowerCase().toCharArray(); 
     char[] bArr = s1.toLowerCase().toCharArray();
  // An array to hold the number of occurrences of each character
  int[] counts = new int[26]; 
  for (int i = 0; i < aArr.length; i++){
   counts[aArr[i]-97]++;  // Increment the count of the character at respective position
   counts[bArr[i]-97]--;  // Decrement the count of the character at respective position
  }
  // If the strings are anagrams, then counts array will be full of zeros not otherwise
  for (int i = 0; i<26; i++){
   if (counts[i] != 0)
    return false;
  } 
пробовал логику хэш-кода для анаграммы дает мне ложный вывод
public static Boolean anagramLogic(String s,String s2){
    char[] ch1 = s.toLowerCase().toCharArray();
        Arrays.sort(ch1);
        char[] ch2= s2.toLowerCase().toCharArray();
        Arrays.sort(ch2);
        return ch1.toString().hashCode()==ch2.toString().hashCode(); //wrong
    }
чтобы исправить этот код, ниже приведен единственный вариант,который я вижу, ценю любые рекомендации
char[] ch1 = s.toLowerCase().toCharArray();
        Arrays.sort(ch1);
        char[] ch2= s2.toLowerCase().toCharArray();
        Arrays.sort(ch2);
        return Arrays.equals(ch1,ch2);
    }