Ich versuche herauszufinden, wie man am besten prüft, ob eine bestimmte Zeichenkette durch Kombinieren anderer Zeichenketten, die ich in einem Array habe, erzeugt werden kann. Die anderen Zeichenfolgen können eine beliebige Länge einschließlich eines Zeichens haben. Außerdem können die Zeichen in den anderen Zeichenfolgen neu angeordnet werden.
Wenn wir also nach dem Wort "dodge" suchen würden und unser String-Array ['god','house','d','e','cat','c','r','jump']
wäre, hätten wir eine Übereinstimmung, da wir die Buchstaben in "god", "d" und "e" kombinieren könnten Erstelle 'Ausweichen'.
Wenn das Array "dot" anstelle von "d" enthält, hätten wir keine Übereinstimmung, da wir alle Zeichen in jedem der Wörter, die wir rekombinieren, verwenden müssen (wir müssten 'o' und ' t 'genauso gut.
Ich möchte auch wissen, welche Wörter verwendet wurden, um das angegebene Wort zu erstellen. Wenn es also eine Übereinstimmung gibt, möchte ich, dass die Funktion die Array-Indizes der Wörter zurückgibt, die neu kombiniert wurden, um das angegebene Wort zu erstellen. Für das obige "Ausweichen" Beispiel würde es [0,2,3] zurückgeben.
Ich habe eine Lösung geschrieben, die den schlimmsten Fall O(2^n)
hat, aber sie wird in den meisten Situationen ziemlich gut funktionieren. Ich habe mit einer Funktion begonnen, die jeden String einem Objekt zuordnet, das alle Buchstaben des Strings zählt. Beispiel:
Wie Sie sehen können, speichert es auch die Größe im Ergebnis. Dies ist die Implementierung:
%Vor%Dann schreibe ich eine Funktion, die zwei gemappte Objekte "subtrahiert". Zum Beispiel:
%Vor% Wie Sie im letzten Beispiel sehen können, gibt die Funktion null
zurück, wenn die Subtraktion nicht möglich ist. Dies ist eine Implementierung für subtract
:
Der letzte Schritt ist das Schreiben einer Methode findCombination(word, dict)
, die eine Kombination zurückgibt, wenn sie eine oder null findet. Beispiele:
Ich verwende eine rekursive Methode mit Backtracking, wobei ich versuche, Wörter von dem gegebenen Schlüssel zu "subtrahieren", bis das Ergebnis "leer" ist:
%Vor% Sie könnten (und sollten) den Code optimieren, indem Sie die Variable mappedDict
nur einmal initialisieren, und nicht jedes Mal, wenn findCombination()
aufgerufen wird.
BEARBEITEN
Dies sollte viel schneller als die naive Lösung sein, da die ganze Arbeit von der eingebauten indexOf-Suche gemacht wird, die wirklich schnell ist, und sie kann bei der ersten Nichtübereinstimmung beendet werden.
Dies ist die naive Lösung:
%Vor%Es sollte Optimierungen geben, die gemacht werden können, um es schneller zu machen, wenn das ein Problem ist.
Algorithmus:
Eine JavaScript-Implementierung:
%Vor%Vorbehalt: Ich habe nicht versucht, das auszuführen. Lass es mich wissen, wenn ich hier oder da einen Tippfehler gemacht habe.
Ich habe gerade festgestellt, dass dieses Problem mit dem Problem mit der Untermenge von Produkten vergleichbar ist. und daher NP-Complete.
Lassen Sie s(x)
eine Größenmethode sein, die eine ganze Zahl für jeden String zurückgibt, indem Sie die Zeichen auf Primzahlen abbilden und dann das Produkt dieser Primzahlen zurückgeben:
Dann bekommen wir
%Vor% Bei einem gegebenen Dictionary A
suchen wir nun nach einer Untermenge A'⊂ A
, so dass das Produkt
entspricht s(key)
für eine gegebene key
.
Tags und Links javascript