einen String Given (nur englische Zeichen annehmen) S
der Länge n
, wir die Anzahl der Palindrom-Teil mit dem folgenden Algorithmus zählen:Zählen Palindrom Teil in O (n)
for i = 0 to |S| do
p1 = number of palindromes centered in i (odd length)
p2 = number of palindromes centered in i and i+1 (even length)
add p1 + p2 to total number of palindromic substrings of S
Der obige Code O(n^2)
ist jedoch. Ich bin an einem Algorithmus interessiert, der dieses Problem in O(n)
löst. Ich weiß sicher, dass es einen gibt, da ich gehört habe, dass mehrere Leute sagen, dass es das tut, und das Problem existiert auf einer lokalen Online-Richter-Seite mit einer Obergrenze von 1 000 000
auf n
, aber ich habe den Algorithmus noch nie gesehen und kann nicht scheinen dazu in der Lage zu sein.
Update:
Die allgemeine Idee, die ich habe, ist len[i] = length of the longest palindrome centered at the character 2i + 1
und eine ähnliche Anordnung für even-Länge Palindrome zu berechnen. Mit einer guten Buchhaltung sollte es möglich sein, dies in O(1)
für jedes Zeichen zu berechnen, was es uns ermöglichen wird, viele Palindrome auf einmal zu zählen. Ich bin fest, wie genau ich das berechnen soll.
Ich werde eine Lösung akzeptieren, die O(n)
und vielleicht sogar O(n log n)
zusätzlichen Speicher verwendet. Ich denke, das ist ohne sie unmöglich.
Alle guten Ideen oder Referenzen sind willkommen.
Was lässt Sie denken, dass die Lösung O (n) Zeit ist? Außerdem ist es ziemlich seltsam, einen O (n) -Zeitalgorithmus zu haben, der O (n log n) -Raum benötigt. –
@Strilanc - Ich denke, es ist O (n), weil das die Komplexität ist, die von einigen Leuten erwähnt wird und die einzige Sache, die in 0,1 Sekunden auf einer Million Zeichen laufen könnte. – IVlad
Related: [Schreiben Sie eine Funktion, die das längste Palindrom in einer gegebenen Zeichenfolge zurückgibt] (http://stackoverflow.com/q/1115001/54262) –