Trouver la plus longue sous-séquence Palindrome avec moins de mémoire

Je suis en train d'essayer de résoudre un problème de programmation dynamique de Cormem de Introduction aux Algorithmes 3e édition (page 405) qui demande le suivant:

Un palindrome est une chaîne non vide de plus de
certains alphabet qui lit le même
en avant et en arrière. Des exemples de
les palindromes sont toutes les chaînes de caractères de longueur
1, civic, racecar, et aibohphobia
(la peur de palindromes).

Donner un algorithme efficace pour trouver
le plus long palindrome qui est un
sous-suite d'une chaîne d'entrée.
Par exemple, compte tenu de l'entrée
charactervotre algorithme doit
retour carac.

Eh bien, je pourrais le résoudre de deux manières:

Première solution:

Le plus long Palindrome sous-suite (LPS) d'une chaîne est tout simplement le Plus Longue Sous-Suite Commune de lui-même et de son inverse. (J'ai cette solution après avoir résolu une autre question connexe, qui demande la Plus Longue Sous-Suite Croissante d'une séquence).
Car c'est tout simplement une CL variante, il prend également en O(n2) en temps et O(n2) de la mémoire.

Deuxième solution:

La deuxième solution est un peu plus élaboré, mais aussi suit le général LCS modèle. Il s'agit de la suite de récurrence:

lps(s[i..j]) = 
    s[i] + lps(s[i+1]..[j-1]) + s[j], if s[i] == s[j];
    max(lps(s[i+1..j]), lps(s[i..j-1])) otherwise

Le pseudo-code pour le calcul de la longueur de la lps est la suivante:

compute-lps(s, n):

    //palindromes with length 1
    for i = 1 to n:
        c[i, i] = 1
    //palindromes with length up to 2
    for i = 1 to n-1:
        c[i, i+1] = (s[i] == s[i+1]) ? 2 : 1

    //palindromes with length up to j+1
    for j = 2 to n-1:
        for i = 1 to n-i:
            if s[i] == s[i+j]:
                c[i, i+j] = 2 + c[i+1, i+j-1]
            else:
                c[i, i+j] = max( c[i+1, i+j] , c[i, i+j-1] )

Encore, il faut O(n2) de temps et de mémoire, si je veux effectivement construire le lps (parce que j'ai 'll besoin de toutes les cellules sur la table). L'analyse des problèmes connexes, tels que l'ol, qui peuvent être résolus grâce à des approches autres que LCS-comme avec moins de mémoire (LIS est résoluble avec O(n) de mémoire), je me demandais si il est possible de le résoudre avec O(n) de mémoire, trop.

LIS atteint cette borne en reliant le candidat de sous-séquences, mais avec des palindromes, il est plus difficile parce que ce qui compte ici n'est pas l'élément précédent dans la sous-suite, mais le premier. Personne ne sait si c'est possible de le faire, ou sont les solutions précédentes mémoire optimale?

source d'informationauteur Luiz Rodrigo