Gibt es einen linearen Zeitalgorithmus, um zu überprüfen, ob eine Folge von Zeichen eine Verkettung von Palindromen ist? Das einzige, was mir in den Sinn kommt, ist die naive Lösung:
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
Hinweis: Die Antwort lautet trivial Ja, wenn Längen-1-Strings als Palindrome definiert sind. Nehmen wir an, dass dies nicht der Fall ist.
algorithms
efficiency
strings
saadtaame
quelle
quelle
Antworten:
Angenommen, Sie möchten disjunkte Palindrome, ist dies als PALSTAR-Problem bekannt, und es gibt einen linearen Zeitalgorithmus von Zvi Galil und Joel Seiferas. Ein linearer Online-Erkennungsalgorithmus für "Palstar" .
Eine Erklärung des Algorithmus finden Sie im Buch hier: Textalgorithmen (siehe verlinkte Seite und die vorhergehenden Seiten).
Wenn Sie mit einem quadratischen Zeitalgorithmus einverstanden sind, scheint die einfache dynamische Programmierung zu funktionieren.
Wenn ein String , behalten wir ein Array bei, das uns sagt, ob s [ 1 , … j ] in Palindrome zerlegt werden kann.s[1,…n] s[1,…j]
Wir pflegen auch eine 2D-Tabelle, die uns sagt, ob ein Palindrom ist oder nicht. Dies können wir in O ( n 2 ) -Zeit konstruieren, indem wir ein Zentrum auswählen und zwei Zeiger nach außen bewegen, um nach Palindromen mit diesem Zentrum zu suchen. Tun Sie dies für jedes mögliche Zentrum: Θ ( n ) Zentren, wobei jedes O ( n ) Zeit benötigt.s[i,…j] O(n2) Θ(n) O(n)
Jetzt können Sie überprüfen, ob in Palindrome zerlegt werden kann, indem Sie für jede prüfen, ob zerlegt werden kann und ob ist ein Palindrom (unter Verwendung der obigen 2D-Tabelle). Dies ergibt einen Zeit- und Raumalgorithmus.1 ≤ i ≤ j - 1 s [ 1 , … i ] s [ i + 1 , … , j + 1 ] Θ ( n 2 ) Θ ( n 2 )s[1,…j+1] 1≤i≤j−1 s [ 1 , … i ] s [ i + 1 , … , j + 1 ] Θ ( n2) Θ ( n2)
Die Raumnutzung kann auf reduziert werden, wenn Sie den Online-Algorithmus von Manacher verwenden, um zu berechnen, ob ein Palindrom ist (wenn von nach gehe ). , im Grunde die 2D-Tabelle loswerden.s [ i + 1 , … j + 1 ] i j - 1 1O ( n ) s [ i + 1 , … j + 1 ] ich j - 1 1
quelle
Wenn eine Überlappung zulässig ist, kann dies in linearer Zeit (in der Größe der Eingabezeichenfolge) erfolgen.
Einige Definitionen
Definieren wir das Konzept des maximalen Palindroms :
Ein maximales Palindrom mit dem Radius k eines Strings S ist ein Teilstring S ', so dass
Wenn beispielsweise
S = banana
, dannS' = anana
ist ein maximales Palindrom mit Radius 2.Ein maximales Palindrom ist ein maximales Palindrom mit dem Radius k für einige k.
Wenn zum Beispiel
S = banana
,"ana"
,"anana"
, sind alle seine maximalen Palindrome.Mit maximalen Palindromen
Wenn wir nun alle maximalen Palindrome einer Zeichenfolge lokalisieren könnten , wäre es einfach zu überprüfen, ob die gesamte Zeichenfolge eine Verkettung von Palindromen ist.
Nimm
S = abbaccazayaz
. Seine maximalen Palindrome sind:"abba" überspannt also [1..4], "acca" über [4..7], "zayaz" über [8..12]. Da sich die Verkettung dieser drei Palindrome (Überlappung ist zulässig?) Über die gesamte Zeichenfolge erstreckt, folgt, dass "abbaccazayaz" die Verkettung von Palindromen ist.
Berechnung maximaler Palindrome in linearer Zeit
Nun stellt sich heraus, dass wir alle maximalen Palindrome einer Zeichenkette S in linearer Zeit lokalisieren können !
*
Die Idee ist, einen Suffixbaum für S zu verwenden, der mit den niedrigsten gemeinsamen Vorfahrenabfragen mit konstanter Zeit ausgestattet ist .
Wir können also überprüfen, ob eine Zeichenfolge S der Länge m eine Verkettung von Palindromen in O (n) -Zeit ist.
*
Gusfield, Dan (1997), "9.2 Finden aller maximalen Palindrome in linearer Zeit", Algorithmen für Strings, Bäume und Sequenzenquelle
nana
anana
Angenommen, Palindrom [] [] ist ein Array und Palindrom (i, j) ist eine Funktion, die prüft, ob der Teilstring von i nach j Palindrom ist und 1 zurückgibt, wenn es Palindrom ist, oder unendlich zurückgibt, wenn es kein Palindrom ist, und Sie nach der kleinsten Zahl suchen Erstellen Sie von unten nach oben Partitionen:
quelle
abbaaccaabba.