La subsecuencia común más larga de la programación dinámica LeetCode

¡Acostúmbrate a escribir juntos! Este es el séptimo día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

tema

Dadas dos cadenas  text1text2, devuelve la longitud de la subsecuencia común más larga de las dos cadenas. Devuelve si no existe una subsecuencia común 0.

Una subsecuencia de una cadena es una nueva cadena que consta de algunos caracteres (o ninguno de ellos) eliminados de la cadena original sin cambiar el orden relativo de los caracteres.

Por ejemplo, "ace"es "abcde"una subsecuencia de , pero "aec"no es "abcde"una subsecuencia de . La subsecuencia común de dos cadenas es la subsecuencia que ambas cadenas tienen en común.

Ejemplo 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
复制代码

Explicación: La subsecuencia común más larga es "ace", su longitud es 3.

Ejemplo 2:

输入:text1 = "abc", text2 = "abc"
输出:3
复制代码

Explicación: La subsecuencia común más larga es "abc", su longitud es 3.

Ejemplo 3:

输入:text1 = "abc", text2 = "def"
输出:0
复制代码

Explicación: las dos cadenas no tienen una subsecuencia común, devuelve 0.  

insinuación:

1 <= text1.length, text2.length <= 1000
text1 和 text2 仅由小写英文字符组成。
复制代码

responder

análisis de resolución de problemas

Ideas para resolver problemas:

  1. El problema de subsecuencia común más largo es un típico problema de programación dinámica bidimensional.
  2. La ecuación de transición de estado es la siguiente:
// text1.charAt(i - 1) == text2.charAt(j - 1)
dp[i][j] = dp[i - 1][j - 1] + 1;
// text1.charAt(i - 1) != text2.charAt(j - 1)
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
复制代码
  1. el resultado final de la devolución dp[m][n];

Complejidad:
Tiempo Complejidad: O(M*N)
Espacio Complejidad:O(M*N)

código de resolución de problemas

El código de la solución es el siguiente (comentarios detallados en el código):


class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
            // 获取长度
            int m = text1.length(), n = text2.length();
            // 创建 dp
            int[][] dp = new int[m + 1][n + 1];
            for (int i = 1; i <= m; i++) {
                char c1 = text1.charAt(i - 1);
                for (int j = 1; j <= n; j++) {
                    char c2 = text2.charAt(j - 1);
                    if (c1 == c2) {
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                    } else {
                        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                    }
                }
            }
            return dp[m][n];
    }
}
复制代码

Resultados de comentarios después del envío (debido a que este tema no ha sido optimizado, el rendimiento es promedio):

imagen.png

Informacion de referencia

Supongo que te gusta

Origin juejin.im/post/7084200685801046029
Recomendado
Clasificación