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:
¿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,
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.