Algorithmus zur Generierung aller möglichen Buchstaben-Kombinationen der gegebenen Zeichenfolge bis auf 2 Buchstaben
Algorithmus zur Generierung aller möglichen Buchstaben-Kombinationen der gegebenen Zeichenfolge bis auf 2 Buchstaben
Versuchen, zu erstellen ein Anagramm Löser in AS3, wie zum Beispiel dieses hier gefunden:
http://homepage.ntlworld.com/adam.bozon/anagramsolver.htm
Ich habe ein problem mit Verpackung mein Gehirn um die Generierung aller möglichen Buchstaben-Kombinationen für die verschiedenen Längen der Saiten. Wenn ich nur zur Erzeugung von Permutationen für eine Feste Länge, es wäre nicht so ein problem für mich... aber ich bin auf der Suche zu reduzieren die Länge der Zeichenfolge und erhalten alle möglichen Permutationen aus dem ursprünglichen Satz von Buchstaben in einer Zeichenfolge mit einer maximalen Länge kleiner als die ursprüngliche Zeichenfolge. Zum Beispiel, sagen, ich will einen string der Länge 2, aber ich habe eine 3-Buchstaben-string "abc", die Ausgabe wäre: ab ac ba bc ca cb.
Idealerweise würde der Algorithmus produziert eine vollständige Liste der möglichen Kombinationen ab, die mit der ursprünglichen Länge des Strings, bis auf die kleinste string der Länge 2. Ich habe das Gefühl, es ist wahrscheinlich eine kleine rekursiven Algorithmus, um dies zu tun, aber nicht einpacken kann mein Gehirn herum. Ich arbeite in AS3.
Dank!
- Wahrscheinlich wäre es viel effizienter, nur die Kombinationen sortiert und zu schauen, jede Kombination in einer hash-Tabelle, die Karten Zeichenfolgen von Buchstaben in sortierter Reihenfolge auf die Wörter, die gebildet werden können als Permutationen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den Zweck des Schreibens ein anagram solver die Art, die Sie im Zusammenhang mit dem Algorithmus, den Sie fordert, ist nicht notwendig. Es ist auch SEHR teuer.
Schauen wir uns eine 6-Buchstaben-Wort wie
MONKEY
zum Beispiel. Alle 6 Buchstaben des Wortes sind unterschiedlich, so dass Sie schaffen würden:Nun, vermutlich versucht man nicht ausspucken alle 1950 Wörtern (z.B. 'OEYKMN') als anagramme (was Sie auch sind, aber die meisten von Ihnen sind auch Kauderwelsch). Ich vermute, Sie haben ein Lexikon, Juristisches Englisch Wörter und Sie wollen einfach nur, um zu überprüfen, ob diese Wörter sind anagramme der Suchbegriff, mit der option, nicht alle Buchstaben.
Wenn das der Fall ist, dann ist das problem einfach.
Bestimmen, wenn 2 Wörter sind anagramme voneinander alles, was Sie tun müssen, ist zu zählen, wie oft die einzelnen Buchstaben werden verwendet, und vergleichen Sie diese zahlen!
Wir beschränken uns auf nur 26 Buchstaben A-Z, groß-und Kleinschreibung. Was Sie tun müssen, ist schreiben eine Funktion
countLetters
nimmt ein Wort und gibt ein array mit 26 Nummern. Die erste Zahl im array entspricht der Anzahl der BuchstabenA
im Wort, die zweite Zahl entspricht der Anzahl derB
usw.Dann, zwei Worte
W1
undW2
sind genaue Anagramm, wenncountLetters(W1)[i] == countLetters(W2)[i]
für jedeni
! Das heißt, jedes Wort verwendet jedem Buchstaben die gleiche Anzahl von Zeiten!Für das, was ich nennen würde die sub-anagramme (
MONEY
ist ein sub-Anagramm vonMONKEY
),W1
ist ein sub-Anagramm vonW2
wenncountLetters(W1)[i] <= countLetters(W2)[i]
für jedeni
! Das heißt, die sub-Anagramm kann weniger von bestimmten Buchstaben, aber nicht mehr!(Hinweis:
MONKEY
ist auch ein sub-Anagramm vonMONKEY
).Dies sollte Ihnen eine schnell genug-Algorithmus, wo in einem gegebenen query-string, alles, was Sie tun müssen, ist Lesen Sie durch das Wörterbuch einmal und vergleicht die Buchstaben zählen-array jedes Wort gegen das Brief-count-array mit den query-Wort. Sie können tun, einige kleinere Optimierungen, aber das sollte gut genug sein.
Alternativ, wenn Sie wollen höchste performance, Sie können Vorverarbeiten das Wörterbuch (die im Voraus bekannt ist), und erstellen Sie einen gerichteten azyklischen Graphen von sub-Anagramm Beziehung.
Hier ist ein Teil eines solchen Graphen für die Abbildung:
Grundsätzlich jeder Knoten ist ein Eimer für alle Wörter, die den gleichen Brief count-array (d.h. Sie sind genau anagramme). Dann gibt es einen Knoten aus
N1
zuN2
wennN2
's array ist<=
(wie oben definiert)N1
's array (die Sie durchführen können, transitive Reduktion zu speichern, die geringste Menge der Kanten).Dann eine Liste aller sub-anagramme eines Wortes, alles, was Sie tun müssen ist, finden Sie die entsprechenden Knoten, um Buchstaben zu zählen, array rekursiv erkunden, alle Knoten erreichbar sind Knoten. Alle Ihre Eimer enthalten würde, die sub-anagramme.
Den folgenden js-code finden alle möglichen "Wörter" in einem n-Buchstaben-Wort. Natürlich bedeutet dies nicht, dass Sie wahre Worte, aber nicht geben Sie alle Kombinationen, die. Auf meinem Rechner dauert es etwa 0,4 Sekunden für einen 7-Buchstaben-Wort und 15 Sekunden für einen 9-Buchstaben-Wort (bis auf fast eine million Möglichkeiten, wenn Sie keine sich wiederholenden Buchstaben). Doch diese Zeiten gehören der Suche in einem Wörterbuch nach und finden die richtige Worte.
Kompletten code an
Code für die Suche von Wörtern in Wörter
Du willst eine Art von arrangements. Wenn Sie vertraut sind mit der permutation Algorithmus dann wissen Sie, Sie haben einen check, um zu sehen, wenn Sie generiert haben genug zahlen. Nur ändern limit:
Ich weiß nicht, AS3, aber hier ist ein pseudocode:
für "abc" und-Anordnungen(3, 2, 1); dies drucken:
Wenn Sie möchten, dass diese mit drei ersten, und dann solche mit zwei, betrachten Sie dieses:
Dann für "abc" nennen
Arrangements(3, 3, 1);
und dannArrangements(3, 2, 1);
Können Sie erzeugen alle Worte in ein alphabet finden, indem alle Pfade in einem vollständigen Graphen der Buchstaben. Finden Sie alle Pfade in diesem graph durch eine depth-first-Suche von jeder Brief und die Rücksendung der aktuelle Pfad in jedem Punkt.
Es ist einfach O(N), wobei n die Größe des Vokabulars.
Sortieren Sie die Buchstaben in jedem Wort in den Wortschatz oder besser, erstellen Sie binäre Maske und Sie dann zu vergleichen mit Buchstaben, die Sie haben.