Un problema: string [] palindrómica subcadena más larga

Descripción

        Introduzca una cadena, que se obtiene palindrómica subcadena más larga. Significado subcadena es: segmento de cadena en la cadena original del consecutiva. Palíndromo significado es: positivo, hacia adelante mirando hacia atrás y buscar el mismo. Como Abba y yyxyy. En la determinación de palíndromos, debe ignorar todo puntuacion y espacios, e ignorando el caso, pero la salida debe permanecer intacto (en la secuencia palindrómica de cabecera y una cola no se imprimen los caracteres adicionales). La longitud de la cadena de entrada no más de 5.000, y ocupa una sola línea. Más larga secuencia palindrómica que sea de salida, si hay múltiples, la posición de partida de los más salida izquierda.

Entrada

Su cadena, la longitud de cadena de no más de 5.000.

Salida

Palindrómica cadena subcadena más larga.

Ejemplo de entrada

Confuciuss decir: Señora, soy Adam.

Ejemplo de salida

Señora, soy Adam

INSINUACIÓN

Descripción de la muestra: Señora, yo soy espacios quitan Adam, comas, apóstrofes, ignorando caso es MADAMIMADAM, es un palíndromo.

Análisis algoritmo I:

En primer lugar resolver el problema, "ignorar puntuacion, la salida en la sentencia, sino como se YAOAN"? Un método simple se puede utilizar: pretratamiento. Construir una nueva cadena que no contiene la puntuacion original, y todos los caracteres en mayúsculas (la manera de resolver el problema de la capitalización). Funciones utilizadas:

(1) la isalpha (c) se utiliza para comprobar si la letra c, si las letras, devoluciones 1; 0 en caso contrario.

(2) isdigit (c) c se utiliza para comprobar si el número (0 a 9), si un número, el retorno 1; 0 en caso contrario.

(3) toupper (c) utilizados para convertir a mayúsculas caracteres c, c rendimientos mayúsculas correspondiente.

(4) tolower (c) c se utiliza para convertir los caracteres en minúsculas, retorno minúsculas correspondiente c.

 

Vamos a enumerar la secuencia palíndromo de inicio y fin, y luego determinar si realmente es una cadena palíndromo.

int max = 0;

for (i = 0; i <m; i ++)

   para (j = i; j <m; j ++)

       if (s [i..j] 是 回文 串 && j-i + 1> max) max = j-i + 1;

"Máxima actual" variable de max, que almacena la longitud del palíndromo encontrado hasta ahora subcadena más larga. Si el tren i-ésimo es carácter a la j-ésima carácter (referido como s [i..j]) es una secuencia palindrómica, la longitud se comprueba si j-i + 1 excede el máximo.

 

Determinación de si s [i..j] El método de la secuencia palindrómica es como sigue:

int ok = 1;

para (k = i; k <= j; k ++)

    si (s [k] = s [i + jk]!) ok = 0;

s [k] es la posición "simétrica" ​​s [i + jk], siempre y cuando falla una comparación, la bandera se debe establecer en 0 la variable OK.

 

 

La pregunta final: es la salida.

    Dado que el valor máximo cuando se evalúa, no sé s [i] y s [j] en la posición original de la cadena en buf. Por lo tanto, es necesario aumentar una matriz p, Guardar s posición [I] en buf por p [i]. Se obtiene en el tratamiento previo, y luego actualizar la max mientras que el p [i] y p [j] y se guarda en x y, el buf salida final [x] a todos los caracteres buf [y] en.

Inadecuada: Al entrar en una cadena larga, fácil de horas extras, porque la enumeración palíndromo de inicio y final del ciclo también.

 

 

Análisis algoritmo II: enumeración de la secuencia palindrómica de la posición "neutral" i, y luego continúan expandiéndose a cabo hasta que haya un carácter diferente. Consejo: pares e impares duración del tratamiento no es lo mismo.

 

La final Código de CA:

<. bits / STDC ++ h> #include 
#include <cstring>
 usando  espacio de nombres std;
const  int maxN = 5,005 ;
int dp [maxN] [maxN], tabla hash [maxN];
int ) {principal (
     bool bandera;
    int i, j, L, bajo, alto;
    string S, ST;
    mientras que (getline (cin, s)) { 
        st = "" ; 
        memset (tabla hash, 0 , sizeof (tabla hash)); 
        memset (dp, 0 , sizeof (dp)); // 记得初始化
        de(i = 0 ; i <s.size (); i ++ ) {
             si (isalpha (s [i])) { 
                st + = toupper (s [i]); 
                HashTable [i] = 1 ; // 表明是字符 
            } demás  si (isdigit (s [i])) { 
                st + = s [i]; 
                HashTable [i] = 1 ; 
            } 
        } 
        Para (i = 0 ; i <st.size (); i ++) dp [i] [i] = 1 ; // 边界 
        bajo = 0 ; 
        alto= 0 ;
        para (L = 2 ; L <= st.size (); L ++ ) { 
            flag = verdadero ;
            para (i = 0 ; i + L- 1 <st.size (); i ++ ) { 
                j = i + L - 1 ;
                // 这里需要注意一下当L == 2时, dp [i + 1] [j-1] == 0 
                si (st [i] == st [j] && (dp [i + 1 ] [j- 1 ] == 1 || L == 2 )) { 
                    dp [i] [j] = 1 ;
                    si (flag) { //Una vez obtenida una secuencia palindrómica de longitud L se actualiza 
                        Low = I; 
                        alta = J; 
                        En Flag = false ; // denotado por el tiempo L se ha actualizado 
                    } 
                } 
            } 
        } 
        para (i = 0 , J = 0 ; I <S .size () && J <Low; I ++) IF (tabla hash [I] == 1. ) J ++; // encontrar el punto final 
        del tiempo (I <s.size () && tabla hash [I] == 0 ) I ++; // eliminado el extremo frontal de los otros caracteres 
        para (; I <s.size () && J <= alta; I ++ ) {
            la printf ( " % C " , S [I]);
             IF (tabla hash [I] == 1. ) J ++; // recuento, para detener el punto final 
        } 
        la printf ( " \ n- " ); 
    } 
    regreso  0 ; 
}

Resumen: En un principio no vio INDIRECTA, y más tarde encontrado las mismas ideas y toque de sus primeras ideas. Esta pregunta, sólo sobre la base de "notas algoritmo" en esa pregunta añadió algunas condiciones, por lo tanto, las variables de código especial atención al escribir hacen mal!

Supongo que te gusta

Origin www.cnblogs.com/heyour/p/12499886.html
Recomendado
Clasificación