Betrachten Sie die schiere Anzahl der möglichen Aufteilungen für eine gegebene Zeichenfolge. Wenn Sie n
Zeichen in der Zeichenfolge haben, gibt es n-1
mögliche Orte zu teilen. Zum Beispiel für die Zeichenfolge cat
, können Sie vor der a
teilen und Sie können vor der t
teilen. Dies führt zu 4 möglichen Aufspaltungen.
Sie könnten dieses Problem als auswählen, wo Sie die Zeichenfolge teilen müssen. Sie müssen auch auswählen, wie viele Splits es geben wird. So gibt es Sum(i = 0 to n - 1, n - 1 choose i)
mögliche Aufspaltungen. Durch die Binomial Coefficient Theorem, wobei x und y beide 1 sind, ist dies gleich pow (2, n-1).
Zugegeben, viele dieser Berechnungen basieren auf allgemeinen Teilproblemen, daher könnte Dynamic Programming Ihren Algorithmus beschleunigen. Von der Spitze meines Kopfes würde die Berechnung einer boolean matrix M such M[i,j] is true if and only if the substring of your given string from i to j is a word
ziemlich viel helfen. Sie haben immer noch eine exponentielle Anzahl möglicher Segmentierungen, aber Sie könnten schnell eine Segmentierung eliminieren, wenn ein früher Split kein Wort gebildet hätte. Eine Lösung wäre dann eine Folge von ganzen Zahlen (i0, j0, i1, j1, ...) mit der Bedingung j sub k
= i sub (k + 1)
.
Wenn Ihr Ziel korrekt Camel Case URLs ist, würde ich das Problem umgehen und für etwas direkteres gehen: Holen Sie sich die Homepage für die URL, entfernen Sie Leerzeichen und Groß- und Kleinschreibung aus dem Quell-HTML und suchen Sie nach Ihrer Zeichenfolge. Wenn es eine Übereinstimmung gibt, suchen Sie diesen Abschnitt im ursprünglichen HTML-Code und geben Sie ihn zurück. Sie würden eine Reihe von NumSpaces benötigen, das erklärt, wie viel Leerzeichen in der ursprünglichen Zeichenfolge auftritt wie so:
Needle: isashort
Haystack: This is a short phrase
Preprocessed: thisisashortphrase
NumSpaces : 000011233333444444
Und Ihre Antwort würde aus:
location = prepocessed.Search(Needle)
locationInOriginal = location + NumSpaces[location]
originalLength = Needle.length() + NumSpaces[location + needle.length()] - NumSpaces[location]
Haystack.substring(locationInOriginal, originalLength)
Natürlich würde dies brechen, wenn madduckets .com hatte keine "Mad Duckets" irgendwo auf der Homepage. Ach, das ist der Preis, den Sie zahlen, um ein exponentielles Problem zu vermeiden.
Eigentlich muss es nicht fast so teuer wie das Rucksackproblem sein. Sie können dynamische Programmiertechniken anwenden, um den Suchraum erheblich zu reduzieren. –
Ja, einverstanden mit Nick Johnson: Dies ist ein einfaches, einfaches O (n^2) dynamisches Programmierproblem. Ein NP-vollständiges Problem zu lösen ist wie ein Brot mit einem Presslufthammer zu schneiden !!! –