2009-02-06 3 views
6

Wie würden Sie Wörter auflisten, die Anagramme von einander sind?Was ist eine einfache Art zu sagen, ob eine Liste von Wörtern Anagramme von einander sind?

Ich wurde diese Frage gestellt, als ich mich für meinen aktuellen Job bewarb.

orchestra kann in carthorse umgeordnet werden mit allen ursprünglichen Buchstaben verwendet genau einmal deshalb sind die Wörter Anagramme von einander.

+1

Hey! Wir stellen diese Frage an jeden Programmierer, den wir interviewen! Du verdirbst Sachen für uns! –

+2

@Jim In Texas: Die Frage verderbt nicht Ihre Interview-Strategie, es zeigt, dass die Interview-Strategie grundsätzlich fehlerhaft ist. Zum Beispiel, wie man einen Mechaniker auswählt, je nachdem, auf welchem ​​Farboverall er steht. Das Wissen an neue Kandidaten zu verschenken, dass Sie immer blaue Overalls wählen, verderbt Ihre Strategie des mechanischen Pickens nicht. Es zeigt es als die Nicht-Strategie, die durch die Tatsache beschädigt wird, dass sie von Leuten ohne Programmierkenntnisse gebrochen werden kann. –

+0

Ich finde es schwierig, sich "Menschen ohne Programmierkenntnisse" vorzustellen, die an einer Tafel stehen und ein Programm schreiben können, um Anagramme zu erkennen. Dies ist eigentlich eine sehr gute anfängliche Bildschirmfrage aus vielen Gründen. Und wenn ein Kandidat interessiert genug ist, diese SO-Frage gelesen zu haben, dann ist das eine gute Sache! –

Antwort

22

Geben Sie alle Buchstaben in alphabetischer Reihenfolge in die Zeichenfolge ein (Sortieralgorithmus) und vergleichen Sie dann die resultierende Zeichenfolge.

-Adam

+1

Ja, das ist ziemlich genau das, was ich mir ausgedacht habe ... Habe den Job auch bekommen! – jqs

+0

Es gibt einen alternativen Algorithmus, bei dem die Zeichen in jedem Wort gezählt werden. Es ist schneller, aber für Unicode-Wörter teurer. –

+0

Ich habe das berücksichtigt, aber dann müssen Sie die resultierenden Buchstaben zählen Arrays, Hashes oder sonst - für kurze Anagramme ist mein Algorithmus wahrscheinlich schneller, aber für größere Anagramme Chancen sind gut Ihre schneller wäre. Wäre ein interessanter Test ... –

6

Sortierung jedes Element (Entfernen von Leerzeichen) und Vergleich mit dem vorherigen. Wenn sie alle gleich sind, sind sie alle Anagramme.

+0

Entfernen Interpunktion auch – dmckee

+0

Interpunktion kann ich verstehen, für Wörter mit einem Apostrohphe, aber Leerzeichen? Ich kenne nicht viele Wörter mit Leerzeichen in ihnen ... Ich denke, für eine einfache Übung wie diese können Sie sicher annehmen, dass die Wörter nur Buchstaben enthalten. – ninesided

+0

Als Anagramme werden Anagramme oft über ganze Phrasen verteilt. Du schreibst also die Routine, um robust zu sein. – dmckee

1

sortieren Briefe und vergleichen (Buchstaben für Buchstaben, string vergleichen, ...) ist das erste, was in den Sinn kommt.

2

sollte Der folgende Algorithmus arbeiten:

  1. Sortieren Sie die Buchstaben in jedem Wort.

  2. Sortieren Sie die sortierten Listen von Buchstaben in jeder Liste.

  3. Vergleichen Sie jedes Element in jeder Liste auf Gleichheit.

+0

Sobald die Listen der Buchstaben sortiert sind, können Sie die erste mit der letzten vergleichen, anstatt jede zu vergleichen. Wenn die erste gleich ist wie die letzte, dann sind sie alle gleich. –

+0

@EricNess Sind Sie sich sicher? Betrachten Sie die Eingabe: "abbc" und "abcc". Gleiche Länge, gleiche erste und letzte Zeichen ... Oder vielleicht habe ich deinen Kommentar missverstanden. – levigroker

10

Gut, dass wir alle in der C# -Realität der In-Place-Sortierung von kurzen Wörtern auf Quad-Core-Maschinen mit oozles Speicher leben. :-)

Wenn Sie jedoch Speicher beschränkt sind und die Originaldaten nicht berühren können und Sie wissen, dass diese Wörter Zeichen aus der unteren Hälfte der ASCII-Tabelle enthalten, können Sie einen anderen Algorithmus verwenden, der zählt das Auftreten jedes Buchstabens in jedem Wort anstelle des Sortierens.

Sie könnten sich auch für diesen Algorithmus entscheiden, wenn Sie es in O (N) machen wollen und sich nicht um die Speichernutzung kümmern (ein Zähler für jedes Unicode-Zeichen kann ziemlich teuer sein).

0
  1. vergleichen Länge (wenn nicht gleich, keine Chance)
  2. machen einen Bitvektor der Länge der Saiten
  3. für jede char in der ersten Zeichenfolge Vorkommen es in der zweiten
  4. finden das Bit für das erste ungesetzt Auftreten
  5. , wenn Sie eine Station mit fehler
  6. finden
2

Nun die Worte in der Liste sortieren.

Wenn abc, bca, cab, cba die Eingänge sind, dann wird die sortierte Liste abc, abc, abc, abc sein.

Jetzt sind alle ihre Hash-Codes gleich.Vergleichen Sie die 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

Versuchte hashcode Logik für Anagramm mich falsch Ausgang

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 
    } 

, um diesen Code zu korrigieren, ist die einzige Option unten gibt, gebe ich zu sehen, zu schätzen wissen alle Empfehlungen

char[] ch1 = s.toLowerCase().toCharArray(); 
     Arrays.sort(ch1); 
     char[] ch2= s2.toLowerCase().toCharArray(); 
     Arrays.sort(ch2); 
     return Arrays.equals(ch1,ch2); 
    }