La programación dinámica Java de subcadena palíndromo más larga con gráfico

Descripción del título
Dada una cadena s, encuentre la subcadena palíndromo más larga en s. Puede suponer que la longitud máxima de s es 1000.

Ejemplo 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

Ejemplo 2:

输入: "cbbd"
输出: "bb"

Ideas de resolución de problemas:
cómo DP es DP, y lo que requiere es lo que establecimos.
Al principio pensé en una matriz unidimensional dp, dp [i] representa la subcadena palíndroma más larga de los primeros i caracteres, 注意这里的子串不是必须连续的y luego f encontré una unidimensional No puedo juzgar.

Se necesitan al menos dos punteros y luego se convierten a dos dimensiones; dp[i][j] 表示i~j位置的最长回文子串o de la misma manera, comenzando desde el final, juzgando la subcadena palíndroma más larga que contiene el último carácter, juzgando que el valor máximo de dp [i] [s.length-1] debe ser A juzgar por el primer lugar.

1. Si s [0] = s [length-1] no es igual , entonces la subcadena más larga que termina con el último carácter 不包含这两者中的至少一个puede ser de tres casos,

1. Incluya el último pero no el primero
2. Excluya el último e incluya el primero
3. Tampoco incluya los dos
como se muestra en la figura:
Inserte la descripción de la imagen aquí

¿Por qué no incluir ambos al mismo tiempo? Sumarlo a la ecuación de transición de estado se puede sumar y se puede obtener la respuesta correcta, pero no es necesario, porque dp [i + 1] [j-1] debe ser 小于等于dp [i] [j -1], dp [i + 1] [j], max es imposible conseguirlo. Cuanto mayor sea el intervalo entre i y j, más palíndromo puede contener. Por el contrario, cuanto menor sea, Cuanto menos sea, quedará claro si lo dibujas en papel, soy vago y no lo voy a dibujar jajajaja

2. Si s [0] = s [longitud-1] son ​​iguales,
entonces dp [i] [j] = dp [i + 1] [j-1] +2, sume el primero y el último

Del análisis anterior, se puede ver que dp [i] [j] se obtiene por los tres métodos que se muestran en la figura, por lo que al atravesar,
Inserte la descripción de la imagen aquíhay un punto más para determinar el límite dp [i] [i] = 1 ;

Subir código

class Solution {
    
    
    public int longestPalindromeSubseq(String s) {
    
    
        int length=s.length();
        int dp[][]=new int [length+1][length+1];
        for(int i=length-1;i>=0;i--){
    
    
            dp[i][i]=1;
            for(int j=i+1;j<length;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][length-1];


    }
}

No pensé en esta pregunta al principio, pero la encontré después de leer las soluciones de otras personas. Escribí esta solución para una mejor comprensión. La escritura es un poco desordenada y le pide al jefe que la deje pasar.

Supongo que te gusta

Origin blog.csdn.net/qq_44844588/article/details/107661087
Recomendado
Clasificación