Si se permite la superposición, se puede hacer en tiempo lineal (en el tamaño de la cadena de entrada).
Algunas definiciones
Definamos el concepto de palíndromo máximo :
Un palíndromo máximo de radio k de una cadena S es una subcadena S 'tal que
- comenzando desde el centro, S 'lee los mismos k caracteres en ambas direcciones
- pero no para k + 1 caracteres
- k> 1 (por lo que un solo personaje no es un palíndromo)
por ejemplo, si S = banana
, entonces S' = anana
es un palíndromo máximo de radio 2.
Un palíndromo máximo es un palíndromo máximo de radio k para algunos k.
Por ejemplo, si S = banana
, "ana"
, "anana"
, son todos los palíndromos sus máximos.
Usando palíndromos máximos
Ahora, si pudiéramos localizar todos los palíndromos máximos de una cadena , sería simple verificar si toda la cadena es una concatenación de palíndromos.
Tomar S = abbaccazayaz
. Sus palíndromos máximos son:
- abba, centrado entre las posiciones 2 y 3, radio = 2
- acca, centrado entre las posiciones 5 y 6, radio = 2
- zayaz, centrado en la posición 10, radio = 2
entonces "abba" abarca más de [1..4], "acca" abarca más de [4..7], "zayaz" abarca más de [8..12]. Dado que la concatenación de estos tres palíndromos (¿se permite la superposición?) Se extiende por toda la cadena, se deduce que "abbaccazayaz" es la concatenación de palíndromos.
Calcular palíndromos máximos en tiempo lineal
¡Ahora resulta que podemos localizar todos los palíndromos máximos de una cadena S en tiempo lineal !*
La idea es utilizar un árbol de sufijos para S equipado con consultas de antepasados comunes más bajas en tiempo constante .
Entonces podemos verificar si una cadena S de longitud m es una concatenación de palíndromos en el tiempo O (n).
*
Gusfield, Dan (1997), "9.2 Encontrar todos los palíndromos máximos en tiempo lineal", Algoritmos sobre cuerdas, árboles y secuencias