[Programación dinámica de Leetcode] La subcadena de palíndromo más larga

Titulo:

Dada una cuerda  s, encuentre  s la subcadena de palíndromo más larga. s La longitud máxima que puede asumir  es 1000.

Ejemplo 1:

Entrada: "babad"
 Salida: "bab"
 Nota: "aba" también es una respuesta válida.

Ejemplo 2

Entrada: "cbbd"
 Salida: "bb"

 

Ideas:

Usando programación dinámica, el estado inicial :

  • dp [i] [i] = 1; // Un solo carácter es una cadena de palíndromo
  • dp [i] [i + 1] = 1 si s [i] = s [i + 1]; // Dos caracteres idénticos consecutivos son cadenas de palíndromo

Considere el ejemplo de "ababa". Si ya sabemos que "bab" es un palíndromo, entonces es obvio que "ababa" debe ser un palíndromo, porque sus letras izquierda y derecha son las mismas. Por lo tanto,

dp [i] [j] = dp [i + 1] [j-1] && s [i] == s [j]

 

Análisis de complejidad.

  • Complejidad del tiempo: O (n ^ 2).

  • Complejidad del espacio: O (n ^ 2), use el espacio O (n ^ 2) para almacenar.

código java:

class Solution {
     public String longestPalindrome(String s) {
        int len = s.length();
        if (len == 0 || len == 1) {
            return s;
        }
         
        //为1表示是回文 默认为0表示不是回文
        int[][] dp = new int[len][len];

        //回文串的开始位置
        int start = 0;
        //回文中的最大长度
        int max = 1;

        for (int k = 2; k <= len; k++) { //l表示检索的子串长度,等于2表示先检索长度为2的子串
            for (int i = 0; i + k - 1 < len; i++) {
                dp[i][i] = 1;
                int j = i + k - 1;//终止字符位置
                if (k == 2) {//k=2时,初始化相邻字符是否为回文串
                    if (s.charAt(i) == s.charAt(j)) {
                        dp[i][j] = 1;
                        start = i;
                        max = 2;
                    }
                } else { //k>2
                    if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1] == 1) {
                        dp[i][j] = 1;
                        start = i;
                        max = k;
                    }
                }

            }

        }

        return s.substring(start, start + max);
    }

}

 

Debido al nivel limitado, inevitablemente habrá algunos errores en el blog. Si hay algún error, ¡te insto a que me lo hagas saber!

 

Lectura recomendada:

[Leetcode- planificación dinámica ] Subiendo escaleras   -CSDN Blog

[Leetcode- planificación dinámica ] el mejor momento para comprar y vender acciones   -CSDN blog

[Leetcode- programación dinámica ] suma de subsecuencia máxima 

[Leetcode- planificación dinámica ] diferentes caminos   -CSDN blog

[Leetcode- planificación dinámica ] lucha en casa 

[Leetcode- planificación dinámica ] Jump game   -CSDN blog

[Leetcode- planificación dinámica ] cambio cambio   -CSDN blog

 

255 artículos originales publicados · Me gustaron 274 · Visitas 330,000+

Supongo que te gusta

Origin blog.csdn.net/kangbin825/article/details/105465088
Recomendado
Clasificación