Estoy tratando de resolver un problema que requiere encontrar el palíndromo más grande en una cadena de hasta 20,000 caracteres. He intentado comprobar cada subcadena, ya sea un palíndromo, que funcionó, pero obviamente fue demasiado lento. Después de un poco de google encontré este buen algoritmo http://stevekrenzel.com/articles/longest-palnidrome. Intenté implementarlo, pero no puedo hacerlo funcionar. Además, la cadena dada contiene caracteres ilegales, por lo que debo convertirla solo en caracteres legales y generar el palíndromo más largo con todos los caracteres.Encontrar el palíndromo más grande en la implementación de cadenas
Aquí está mi intento:
int len = original.length();
int longest = 0;
string answer;
for (int i = 0; i < len-1; i++){
int lower(0), upper(0);
if (len % 2 == 0){
lower = i;
upper = i+1;
} else {
lower = i;
upper = i;
}
while (lower >= 0 && upper <= len){
string s2 = original.substr(lower,upper-lower+1);
string s = convert(s2);
if (s[0] == s[s.length()-1]){
lower -= 1;
upper += 1;
} else {
if (s.length() > longest){
longest = s.length();
answer = s2;
}
break;
}
}
}
no puedo conseguir que funcione, lo he intentado usar este algoritmo exacto en el papel y funcionó, por favor ayuda. Aquí está el código completo, si lo necesita: http://pastebin.com/sSskr3GY
EDIT:
int longest = 0;
string answer;
string converted = convert(original);
int len = converted.length();
if (len % 2 == 0){
for (int i = 0; i < len - 1; i++){
int lower(i),upper(i+1);
while (lower >= 0 && upper <= len && converted[lower] == converted[upper]){
lower -= 1;
upper += 1;
}
string s = converted.substr(lower+1,upper-lower-1);
if (s.length() > longest){
longest = s.length();
answer = s;
}
}
} else {
for (int i = 0; i < len; i++){
int lower(i), upper(i);
while (lower >= 0 && upper <= len && converted[lower] == converted[upper]){
lower -= 1;
upper += 1;
}
string s = converted.substr(lower+1,upper-lower-1);
if (s.length() > longest){
longest = s.length();
answer = s;
}
}
}
Bueno por lo que han solucionado los problemas, funciona perfectamente bien, pero sólo si la longitud de la cadena convertida es impar. Por favor ayuda.
Tal vez esta pregunta pertenece a http://codereview.stackexchange.com/? –