leetcode0005 palíndromo más larga: la programación dinámica, divide y vencerás caché versiones anteriores

  blog anterior escribió una solución de partición y por qué utilizar divide y vencerás.

  Mediante la definición de sub-dividir y conquistar nuestros problemas, tenemos una instancia de la semántica de cada paso del cálculo, nosotros lo que ayuda a encontrar la estructura de solución de espacio repetición.

  Durante la partición, nos encontramos con la segmentación y representación de Soluciones Solución del problema que es la ecuación de transición de estado:

 

   Particionar todo el proceso de cálculo se divide en dos etapas, la segmentación hacia abajo, hasta soluciones sub-problema de la convergencia para obtener una solución definitiva al problema.

  A continuación, el caché, somos la solución paso a paso desde el tamaño mínimo del problema se convierta en un gran problema volver Resumida solución.

  De hecho, con la ecuación de transición de estado, podemos dar un paso segmentación se omite, la solución final directamente desde el pequeño problema de la solución recursiva del problema de la demanda.

  Por ejemplo, la ecuación de transición de estados antes mencionada, i incremento / decremento cuando j se divide en cuestión, entonces desde el más pequeño sub-pregunta directamente: máximo i, con un mínimo de inicio j, en orden descendente de i / j para llenar la memoria caché en el orden de entrega creciente solución del problema original se determinó que era de empuje.

  Tenga en cuenta que durante el proceso de llenado límite, el límite en el caso en el que hay dos tipos de la ecuación de transición de estado descrita anteriormente:

  1. i es menor que la longitud de cadena, i + 1 sea de otro modo fuera de alcance. 

  2. j mayor que 0, j-1 sería de otro modo fuera de límites.

  Mayor que o igual a 3. j i, j semántica como el límite derecho, la semántica borde izquierdo i.

  Desde el 3 y el i> = 0, por lo que la garantía es para asegurar que el 3 2, 1, 3, que sólo hay que considerar el caso de los dos límites puede ser.

  Después de hacer algunas preguntas un poco de sentimiento, si se trata de dividir y conquistar Ye Hao espacio de soluciones de programación dinámica para poner ahí no va a cambiar, mejorar la eficiencia es que se evita la doble contabilidad mediante la búsqueda de la repetición de la estructura del espacio de soluciones. Sobre la base de nuestra definición de los problemas estructurales. La definición de la estructura más racional del problema, la parte más reutilizable que se puede encontrar un espacio de soluciones.

  Y sólo un codicioso y solución retroceso técnicas de búsqueda de espacio, en la cara de una escena en particular que deben tener esta línea de pensamiento, que es necesaria en una escena en particular, en lugar de mejorar la eficiencia.

  Evitar la poda es inválida cálculo, comprensión estrecha directa de espacio. Sobre la base de nuestra definición del problema mismo.

    int maxLength = 0 ; 
    Ans de Cuerda = "" ; 

    pública  definitiva dp String (cadena fuente) {
         si (fuente == nula || source.length () == 0 ) {
             retorno "" ; 
        } 
        Int length = source.length ();
        int [] [] cache = nuevo  int [longitud] [longitud]; 

        para ( int izquierda = longitud-1; izquierdo> = 0; izquierda- abajo ) {
             para ( int derecha = izquierda; derecho <longitud; derecho ++ ) {
                 // 边界处理
                si (a la izquierda == derecha) { 
                    caché [dejó] [right] = 1 ;
                    continuar ; 
                } 
                Si (a la izquierda == longitud-1 ) {
                     si (cache [izquierda] [derecha-1] == 1 && source.charAt (izquierda) == source.charAt (derecha)) { 
                        caché [izquierda] [derecha] = 1 ;
                        int tempLength = derecha izquierda;
                        si (tempLength> maxLength) { 
                            maxLength = tempLength; 
                            ans = source.substring (izquierda, derecha + 1); 
                        } 
                        Continuar ; 
                    } 
                    Cache [izquierda] [derecha] = -1 ; 
                } 
                // subcadena negativo, secuencia negativa directamente a la principal 
                IF [. Izquierdo + 1]. (Cache [. -Justo 1] == - 1 ) { 
                    Cache [izquierda ] [right] = -1 ;
                     Continuar ; 
                } 
                // subcadena secuencia palindrómica, determina la cadena principal 
                Char leftChar = source.charAt (izquierda);
                 Char rightChar = source.charAt (derecha);
                 IF (! = leftChar rightChar) { 
                    caché [izquierda] [derecha]= -1 ;
                    continuar ; 
                } 
                // 主串也是回文串,更新结果
                int tempLength = derecha a la izquierda;
                si (tempLength> maxLength) { 
                    maxLength = tempLength; 
                    ans = source.substring (izquierda, derecha + 1 ); 
                } 
                Caché [izquierda] [derecha] = 1 ; 
            } 
        } 
        Si (maxLength == 0 ) {
             retorno source.substring (0,1 ); 
        } 
        Devolver ans; 
    }

 

  

Supongo que te gusta

Origin www.cnblogs.com/niuyourou/p/12483830.html
Recomendado
Clasificación