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 ques
la longitud máxima1000
.Nota : No es necesario que la subsecuencia sea continua
Ejemplo 1:
输入"bbbab"
输出 4
一个可能的最长回文子序列为 "bbbb"。
Ejemplo 2:
输入"cbbd"
输出 2
一个可能的最长回文子序列为 "bb"。
Aquí para dp
definir 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 s
longitud 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 i
ciertamente menos j
para esas i > j
posiciones, 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:
- 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];
}
}
- 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)