código
1 // mínimo subcadena palindrómica, haciendo caso omiso de puntuacion y espacios 2 #include <stdio.h> . 3 #include < cadena .h> . 4 # include <ctype.h> . 5 #define MAXN 5000 + 10 . 6 . 7 Char buf [MAXN] , S [MAXN]; . 8 int P [MAXN]; . 9 int main () 10 { 11. int n-, m = 0 ; 12 es fgets (buf, el sizeof (S), stdin); 13 es n- = strlen (BUF); 14 para ( int I = 0 ; I <n-; I ++ ) 15 { 16 SI (el isalpha (buf [I])) 17. { 18 es P [m] = I; . 19 S [m ++] = toupper (buf [i]); 20 es } 21 es } 22 es la printf ( " % S \ n- " , S); 23 es 24 int max = 0 , X = 0 , Y = 0 ; 25 26 es 27 // No optimización 28 / * for (i = 0; I <m; i ++) // este enfoque requiere un triple ciclo, ver si otra manera siguiente 29 { 30 31 se for (int j = i; j <m; j ++) 32 { 33 int ok = 1, k; 34 for (k = 0; k <= (ji) / 2; k ++) 35 { 36 if (! S [i + k] = s [jk]) 37 { 38 ok = 0; 39 break; 40 } 41 } 42 Si (ok && j-i + 1> max) 43 { 44 max = j-i + 1; 45 x = p [i]; 46 y = p [j]; 47 } 48 } 49 } * / 50 51 es // método de optimización 52 es para (i = 0 ; i <m; i ++) // esta i está en el centro, justo detector extensión 2 de manera cíclica a ambos lados, pero dos puntos de paridad el ciclo 53 es { 54 es int K; 55 para (K = 0 ; IK> = 0 && I + K <m; K ++) // secuencia palindrómica tiene un número impar, s [i] para la secuencia palindrómica intermedio 56 { 57 IF (! S = S [K + I] [IK]) PAUSA ; // if (! S [IK] = S [K + I]) 58 // { 59 IF ( 2 * K + . 1> max) // si (2 * (k-1) 1> max) 60 { // { 61 max = 2 * k + 1 ; // max = 2 * (k-1) 1; 62 x = p [ik]; // x = p [i- (k-1)]; 63 y = p [i + k]; // y = p [i + (k-1)]; 64 } // } 65 // romper; 66 //} Si una frase tal escrito en un bloque, cuando el máximo aparece secuencia palindrómica al principio o al final, ya que el bucle se determina primero para el ik <0 o K + I> m, 67 } // causando bucle de circulación para el extremo directa, no puede entrar si (2 * (k-1 ) 1> max) bloque de instrucciones, de modo que el máximo, x, y actualización falla, error 68 69 para (K = 0 ; IK> = 0 && I + K + 1. <m; K ++) / / secuencia palindrómica tiene un número par, s [i] para la secuencia palindrómica de centro izquierda 70 { 71 es SI (S [IK] S = [I + K +! 1. ]) PAUSA ; // IF (S [IK]! S = [I + K +. 1]) 72 // { 73 es SI ( 2 * K + 2 > max) // IF (2 * (K- 1) 2> max.) 74 { // { 75 max = 2 * K + 2 ; // max = 2 * (K- 1). 2; 76 X = P [IK]; / / X = P [I- (1-K.)]; 77 Y = P [I + K + 1. ]; // Y = P [I + (1-K.) hecho +1]; 78 } // } 79 // ROTURA ; 80 // } mal por la misma razón. 81 } 82 } 83 84 85 86 la printf ( " subcadena palindrómica (longitud más larga de caracteres solamente):% D \ n- " , max); 87 para (I = X; I <= Y; I ++ ) la putchar (buf [I ]); 88 la putchar ( ' \ n- ' ); 89 de retorno 0 ; 90 }