¿Existe un algoritmo de tiempo lineal para verificar que una secuencia de caracteres es una concatenación de palíndromos? Lo único que me viene a la mente es la solución ingenua:
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
Nota: la respuesta es trivialmente sí si las cadenas de longitud 1 se definen como palíndromos. Asumamos que este no es el caso.
algorithms
efficiency
strings
saadtaame
fuente
fuente
Respuestas:
Suponiendo que desea palíndromos disjuntos, esto se conoce como el problema PALSTAR, y hay un algoritmo de tiempo lineal de Zvi Galil y Joel Seiferas. Algoritmo de reconocimiento en línea de tiempo lineal para `` Palstar '' .
Puede encontrar una explicación del algoritmo en el libro aquí: Algoritmos de texto (consulte la página vinculada y las páginas anteriores).
Si está de acuerdo con un algoritmo de tiempo cuadrático, la programación dinámica directa parece funcionar.
Dada una cadena , mantenemos una matriz que nos dice si puede descomponerse en palíndromos.s[1,…n] s[1,…j]
También mantenemos una tabla 2D que nos dice si es un palíndromo o no. Esto lo podemos construir en el tiempo eligiendo un centro y moviendo dos punteros hacia afuera, buscando palíndromos con ese centro. Haga esto para cada centro posible: centros, cada uno tomando tiempo .s[i,…j] O(n2) Θ(n) O(n)
Ahora, puede verificar si puede descomponerse en palíndromos, verificando para cada si puede descomponerse, y si es un palíndromo (usando la tabla 2D anterior). Esto produce un algoritmo tiempo y espacio.s[1,…j+1] 1≤i≤j−1 s[1,…i] s[i+1,…,j+1] Θ(n2) Θ(n2)
El uso de espacio puede ser llevado hacia abajo a , si se utiliza de Manacher algoritmo en línea para calcular si es un palíndromo (como va de a ) , básicamente deshacerse de la tabla 2D.O(n) s[i+1,…j+1] i j−1 1
fuente
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
por ejemplo, si
S = banana
, entoncesS' = 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: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 secuenciasfuente
nana
anana
Suponga que Palindrome [] [] es una matriz y Palindrome (i, j) es una función que verifica si la subcadena de i a j es palindrome y devuelve 1 si es palindrome o devuelve infinito si no es palindrome, y está buscando el número más pequeño de particiones, créelo de abajo hacia arriba:
Debe llenar las celdas y cada celda toma como máximo para que el algoritmo sea , con una pequeña modificación (preprocesamiento) puede mejorarlo a , también Encontrar esta partición no es difícil.O(n2) O(n) O(n3) O(n2)
fuente
abbaaccaabba.