dar más detalles sobre VenomFangs respuesta, no es una solución de programación dinámica simple de éste. Tenga en cuenta que supongo que la única operación permitida aquí es la inserción de caracteres (sin eliminación, actualizaciones). Deje que S sea una cadena de n caracteres. El simple función de recursividad P para esto es:
= P [i+1 .. j-1], if S[i] = S[j]
P [i..j]
= min (P[i..j-1], P[i+1..j]) + 1,
Si desea una explicación más detallada acerca de por qué esto es cierto, colocar un comentario y me ser feliz de explicar (aunque es bastante fácil de ver con un poco de pensamiento). Esto, dicho sea de paso, es exactamente lo contrario de la función LCS que utiliza, por lo tanto, valida que su solución es, de hecho, óptima. Por supuesto que es totalmente posible que me haya equivocado, si es así, ¡alguien hágamelo saber!
Editar: Para tener en cuenta la propia palíndromo, esto se puede hacer fácilmente de la siguiente manera: Como se indicó anteriormente, P [1..n] le daría el número de inserciones necesarias para que esta cadena un palíndromo. Una vez que se construye el conjunto de dos dimensiones anterior, así es como se encuentra el palíndromo:
Comience con i = 1, j = n. Ahora, string output = "";
while(i < j)
{
if (P[i][j] == P[i+1][j-1]) //this happens if no insertions were made at this point
{
output = output + S[i];
i++;
j--;
}
else
if (P[i][j] == P[i+1][j]) //
{
output = output + S[i];
i++;
}
else
{
output = S[j] + output;
j--;
}
}
cout<<output<<reverse(output);
//You may have to be careful about odd sized palindromes here,
// I haven't accounted for that, it just needs one simple check
¿Lees una mejor lectura?
Gracias @kyun. Pero descubrí con éxito el número de inserciones que se realizarán. ¿He especificado que necesito encontrar la cadena de palíndromo formada después de las inserciones? ¿Me puede dar una solución óptima? Agradeciendotelo de antemano. – whitepearl
Editado ahora, ¿eso ayuda? – kyun