Что это простой способ сказать, если список слов, которые являются анаграммами друг друга?

Как бы вы перечислили слова, которые являются анаграммами друг друга?

мне задали этот вопрос, когда я подал заявку на свою текущую работу.

orchestra можно переставить в carthorse со всеми оригинальными буквами, используемыми ровно один раз, поэтому слова являются анаграммами друг друга.

10 ответов


Поместите все буквы в алфавитном порядке в строку (алгоритм сортировки), а затем сравните полученную строку.

Адам


хорошо, что мы все живем в реальности c# сортировки на месте коротких слов на четырехъядерных машинах с сочится памяти. :-)

однако, если вы ограничены в памяти и не можете коснуться исходных данных, и вы знаете, что эти слова содержат символы из нижней половины таблицы ASCII, вы можете пойти на другой алгоритм, который подсчитывает появление каждой буквы в каждом слове вместо сортировки.

вы также можете выбрать этот алгоритм, если вы хотите сделать это в O (N) и не заботитесь об использовании памяти (счетчик для каждого символа Unicode может быть довольно дорогим).


сортировка каждого элемента (удаление пробелов) и сравнение с предыдущим. Если все они одинаковы, то это анаграммы.


интересно, что сказочные приключения Эрика Липперта в блоге кодирования разбирался с вариацией на эту самую проблему 4 февраля 2009 года в этот пост.


должен работать следующий алгоритм:

  1. сортировка букв в каждом слове.

  2. сортировка отсортированных списков букв в каждом списке.

  3. сравниваем каждый элемент в каждом списке для равенства.


Ну сортировать слова в списке.

Если входами являются abc, bca, cab, cba, то отсортированным списком будет abc, abc, abc, abc.

теперь все их хэш-код равны. Сравните хэш-коды.


сортировка букв и сравнение (буква за буквой, строка сравнения, ...) это первое, что приходит на ум.


  1. сравнить длину (если не равно, не шанс)
  2. сделайте битовый вектор длины строк
  3. для каждого char в первой строке найти вхождения его во втором
  4. установите бит для первого вхождения unset
  5. Если вы можете найти одну остановку с ошибкой

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);
    }