Erstellen Sie eine trie der Wörter, die Sie im Wörterbuch haben, die Suche schneller machen wird. Durchsuchen Sie den Baum anhand der folgenden Buchstaben Ihrer Eingabezeichenfolge. Wenn Sie ein Wort gefunden haben, das sich in der Baumstruktur befindet, beginnen Sie rekursiv mit der Position nach dem Wort in der Eingabezeichenfolge. Wenn Sie das Ende der Eingabezeichenfolge erreichen, haben Sie eine mögliche Fragmentierung gefunden. Wenn Sie stecken geblieben sind, kommen Sie zurück und versuchen Sie rekursiv ein anderes Wort.
EDIT: Entschuldigung, verpasste die Tatsache, dass es nur zwei Worte sein muss. In diesem Fall begrenzen die Rekursionstiefe 2.
Der Pseudo-Code für 2 Worte sei:
T = trie of words in the dictionary
for every word in T, which can be found going down the tree by choosing the next letter of the input string each time we move to the child:
p <- length(word)
if T contains input_string[p:length(intput_string)]:
return true
return false
Unter der Annahme, können Sie zu einem untergeordneten Knoten in der Trie in O(1)
(ascii-Indizes von Kindern nach unten gehen), können Sie alle Präfixe der Eingabezeichenfolge in O(n+p)
finden, wobei die Anzahl der Präfixe und n
die Länge des Eingangs ist. Obere Grenze ist O(n+m)
, wobei m
die Anzahl der Wörter im Wörterbuch ist. Die Prüfung auf containing dauert O(w)
wobei w
die Länge des Wortes ist, für das die obere Grenze m
wäre, so dass die Zeitkomplexität des Algorithmus O(nm)
ist, da O(n)
in der ersten Phase zwischen allen gefundenen Wörtern verteilt wird.
Aber weil wir in der ersten Phase nicht mehr als n
Wörter finden können, ist die Komplexität auch auf O(n^2)
beschränkt. So würde die Suchkomplexität sein O(n*min(n, m))
Vor diesem müssen Sie den Trie bauen, der O(s)
nehmen wird, wobei s
die Summe der Längen der Wörter im Wörterbuch ist. Die obere Schranke ist O(n*m)
, da die maximale Länge jedes Wortes n
ist.
möchte ich glaube, er für beide bittet. – Blizzer