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−1s [ 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 ]ichj - 11