Zerlegt eine Zeichenkette in Wörter
Ich bin auf der Suche nach der effizienteste Algorithmus bilden alle möglichen Kombinationen der Wörter aus einem string. Zum Beispiel:
Input String: forevercarrot
Output:
forever carrot
forever car rot
for ever carrot
for ever car rot
(Alle Wörter aus einem Wörterbuch).
Ich denken kann ein brute-force-Ansatz. (finden alle möglichen Teilstrings und match), aber was wäre besser Möglichkeiten?
- Ihre brute-force-Ansatz ist richtig. Stellen Sie sich vor Sie gegeben wurden das gleiche problem, außer für die Anfrage für Worte in einer fremden Sprache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Präfix-Baum für die Liste der bekannten Wörter. Wahrscheinlich libs wie
myspell
dies bereits tun. Versuchen Sie, eine ready-made-man.Sobald Sie eine übereinstimmung gefunden (z.B. "Auto"), teilen Ihre Berechnung: ein Zweig beginnt zu schauen, für ein neues Wort ('rot'), anderen weiter zu erforschen Varianten der aktuellen Anfang ('Zuckerbrot').
Effektiv pflegen Sie eine queue von Paaren
(start_position, current_position)
von offsets in den string jedes mal, wenn Sie teilen Sie die Berechnung. Mehrere threads können pop aus dieser Warteschlange parallel und versuchen Sie weiterhin ein Wort, das beginntstart_position
und ist schon bekannt bis zucurrent_position
des Paares, aber nicht zu Ende. Wenn ein Wort gefunden ist, wird es gemeldet und ein weiteres paar aufgetaucht, aus der Warteschlange. Wenn es nicht möglich ist, wird kein Ergebnis erzeugt. Wenn ein split geschieht, ein paar neue Hinzugefügt, um das Ende der Warteschlange. Zunächst die Warteschlange enthält ein(0,0)
.Sehen, diese Frage, die hat auch bessere Antworten. Es ist ein standard, der dynamische Programmierung problem:
Wie teilt eine Zeichenkette in Wörter. Ex: "stringintowords" -> "String In Worten"?
Einen psuedocode Umsetzung, ausnutzen der Tatsache, dass jeder Teil des Strings muss ein Wort sein, wir können nicht überspringen Sie nichts. Wir arbeiten uns aus dem Anfang der Zeichenfolge, bis das erste bit ist ein Wort, und erzeugen dann alle möglichen Kombinationen der rest der Zeichenkette. Sobald wir dies getan haben, können wir weiter entlang, bis wir finden andere Möglichkeiten für das erste Wort, und so weiter.
Den Popanz in diesem code ist, dass Sie am Ende werde sich wiederholende Berechnungen - in deinem Beispiel werden Sie am Ende mit zu berechnen
allPossibleWords("carrot")
zweimal - einmal in["forever", allPossibleWords["carrot"]]
und einmal in["for", "ever", allPossibleWords["carrot"]]
. So memoizing das ist etwas zu prüfen.Input String: forevercarrot
Ausgabe:
ewig Karotte
für immer Auto rot
für immer Karotte
für immer Auto rot
Programm :