La "subsecuencia palíndromo más larga" de la serie de programación dinámica

516. La subsecuencia palíndromo más larga

Dada una cadena s, busque la subsecuencia de palíndromo más larga y devuelva la longitud de la secuencia. Se puede suponer que sla longitud máxima 1000.

Nota : No es necesario que la subsecuencia sea continua

Ejemplo 1:

输入"bbbab"
输出 4
一个可能的最长回文子序列为 "bbbb"。

Ejemplo 2:

输入"cbbd"
输出 2
一个可能的最长回文子序列为 "bb"。

Aquí para dpdefinir la matriz es: subcadena s[i..j], la longitud de la secuencia más larga es palindrómica dp[i][j].

Específicamente, si queremos preguntar dp[i][j], asumiendo que el niño conoce los dp[i+1][j-1]resultados del problema ( s[i+1..j-1]la secuencia palindrómica más larga de sublongitud), si puede encontrar una manera de calcular el dp[i][j]valor ( s[i..j]en la longitud de la secuencia palindrómica más larga)

¡pueden! Depende s[i]y s[j]personajes:

Si Talia es igual, agregue Talia. La s[i+1..j-1]secuencia palindrómica más larga es el hijo de s[i..j]la secuencia palindrómica más larga:

Si no es igual a Talia, la explicación poco probable de Talia, mientras que s[i..j]la secuencia palindrómica más larga, por lo que se agregó Talia s[i+1..j-1], para ver cuál produce la subcadena, las secuencias palindrómicas más largas pueden ser:

Los dos casos anteriores están escritos en un código como este:

if(s.charAt(i) == s.charAt(j)){
    
    
  	dp[i][j] = dp[i+1][j-1] + 2;
}else{
    
    
  	dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}

Hasta ahora, la ecuación de transición de estado para escribir, por definición, matriz dp, que requerimos es dp[0][n - 1], es decir, la slongitud completa de la secuencia palindrómica más larga.

Primero aclare el caso base. Si solo hay un carácter, obviamente la longitud de la subsecuencia palíndromo más larga es 1, es decir dp[i][j] = 1 (i == j).

Porque iciertamente menos jpara esas i > jposiciones, simplemente no hay qué secuencia debe inicializarse a cero.

Además, echa un vistazo a la ecuación de transición de estado acaba de escribir, me gustaría preguntar dp[i][j]lo que necesita saber dp[i+1][j-1], dp[i+1][j], dp[i][j-1]las tres posiciones;

Echemos un vistazo al caso base que hemos determinado, después de completar la matriz dp, se ve así:

Para garantizar que dp[i][j]la posición en la dirección inferior izquierda y derecha se ha calculado para cada cálculo , solo se puede recorrer en diagonal o en sentido inverso:

  1. Atravesar en diagonal
class Solution {
    
    

    public int longestPalindromeSubseq(String s) {
    
    
        int n = s.length();
        int[][] dp = new int[n][n];

        for(int i = 0; i <= n-1; i++){
    
    
            dp[i][i] = 1;
        }

        for(int j = 1; j <= n-1; j++){
    
    
            for(int i = 0; i <= n-j-1; i++){
    
    
                if(s.charAt(i) == s.charAt(j+i)){
    
    
                    dp[i][j+i] = dp[i+1][j+i-1] + 2;
                }else{
    
    
                    dp[i][j+i] = Math.max(dp[i+1][j+i], dp[i][j+i-1]);
                }
            }
        }
        return dp[0][n-1];
    }
}
  1. Recorrido inverso
class Solution {
    
    
    public int longestPalindromeSubseq(String s) {
    
    
        int n = s.length();
        int[][] dp = new int[n][n];
        for(int i = n-1; i >= 0; i--){
    
    
            dp[i][i] = 1;
            for(int j = i+1; j < n; j++ ){
    
    
                if(s.charAt(i) == s.charAt(j)){
    
    
                    dp[i][j] = dp[i+1][j-1] + 2;
                }else{
    
    
                    dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
        return dp[0][n-1];
    }
}

Complejidad de tiempo: O (n ^ 2)

Complejidad del espacio: O (n ^ 2)

Supongo que te gusta

Origin blog.csdn.net/weixin_44471490/article/details/109095496
Recomendado
Clasificación