2009-02-06 2 views
6

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

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

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

+1

Эй! Мы задаем этот вопрос каждому программисту, с которым мы беседуем! Ты портишь вещи для нас! –

+2

@Jim В Техасе: вопрос не портит вашу стратегию интервью, он показывает, что стратегия интервью будет в корне ошибочной. Как собирать механика, исходя из того, какие цвета он имеет. Утечка знаний новым кандидатам, которые вы всегда выбираете синим комбинезоном, не портит вашу стратегию выбора механиков. Он раскрывает это как нестратегию как недостаток того, что ее могут нарушить люди, не знающие программирования. –

+0

Мне сложно изобразить «людей без знания программирования», которые могут встать на белой доске и написать программу для обнаружения анаграмм. На самом деле это действительно отличный начальный экранный вопрос по многим причинам. И действительно, если кандидат заинтересован достаточно, чтобы прочитать этот вопрос, тогда это хорошо! –

ответ

22

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

-Adam

+1

Да, это в значительной степени то, что я придумал ... Получил задание! – jqs

+0

Существует альтернативный алгоритм, включающий подсчет символов в каждом слове. Это быстрее, но для юникодовых слов это будет дороже. –

+0

Я подумал об этом, но тогда вам нужно сравнить полученные массивы счетчиков, хэши или иначе - для коротких анаграмм мой алгоритм, скорее всего, быстрее, но для больших анаграмм шансы хорошие, ваши будут быстрее. Было бы интересным тестом ... –

6

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

+0

Удаление знаков препинания также – dmckee

+0

пунктуация Я могу понять, для слов с апострофе, но пространства? Я не знаю много слов с пробелами в них ... Я думаю, что для простого упражнения, подобного этому, можно смело предположить, что слова содержат только буквы. – ninesided

+0

Когда представлены в виде головоломок, анаграммы часто распространяются на целые фразы. Поэтому вы пишете рутину, чтобы быть надежной. – dmckee

1

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

2

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

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

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

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

+0

После сортировки списков букв вы можете сравнить первое и последнее, а не сравнивать их. Если первое совпадает с последним, то все они равны. –

+0

@EricNess Вы в этом уверены? Рассмотрим ввод: «abbc» и «abcc». Такая же длина, одни и те же первые и последние персонажи ... Или, может быть, я неправильно понял ваш комментарий. – levigroker

10

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

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

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

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

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

, если abc, bca, cab, cba - входы, тогда отсортированный список будет abc, abc, abc, abc.

сейчас все их хэш-коды равные.Сравните HashCodes.

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

Пробовал хэш логика анаграммы дает мне ложные выходные

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); 
    } 
Смежные вопросы