Dada una cadena (se supone sólo caracteres ingleses) S
de longitud n
, podemos contar el número de subseries palindrómicas con el siguiente algoritmo:Contando subseries palindrómicas en 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
El código anterior es O(n^2)
sin embargo.
Estoy interesado en un algoritmo que resuelve este problema en O(n)
. Sé con certeza que existe uno ya que he escuchado a varias personas decir que sí, y el problema existe en un sitio local de jueces en línea con un límite superior de 1 000 000
en n
, sin embargo, nunca he visto el algoritmo y no puedo parece ser capaz de inventarlo.
Actualización:
La idea general que tengo es para calcular len[i] = length of the longest palindrome centered at the character 2i + 1
y una matriz similar para palíndromos incluso de longitud. Con una buena contabilidad, debería ser posible calcular esto en O(1)
para cada personaje, lo que nos permitirá contar una gran cantidad de palíndromos a la vez. Sin embargo, estoy atascado en cómo exactamente calcular esto.
Aceptaré una solución que utiliza O(n)
y quizás incluso O(n log n)
memoria extra. Creo que esto es imposible sin eso.
Se agradecen todas las buenas ideas o referencias.
¿Qué le hace pensar que la solución es O (n) time? Además, es bastante extraño tener un algoritmo de tiempo O (n) que requiere espacio O (n log n). –
@Strilanc - Creo que es O (n) porque esa es la complejidad mencionada por algunas personas y la única que podría ejecutarse en 0.1 segundos en un millón de caracteres. – IVlad
Relacionado: [Escriba una función que devuelve el palíndromo más largo en una cadena dada] (http://stackoverflow.com/q/1115001/54262) –