LeetCode La programación dinámica Java de subsecuencia común más larga tiene un diagrama

Descripción del Título

Dadas dos cadenas text1 y text2, devuelve la longitud de la subsecuencia común más larga de estas dos cadenas.

Una subsecuencia de una cadena de caracteres se refiere a una nueva cadena de caracteres: es una nueva cadena de caracteres formada al eliminar algunos caracteres (o ningún carácter) de la cadena original sin cambiar el orden relativo de los caracteres.

Por ejemplo ,

"ace""abcde" 的子序列,但 "aec" 不是 
"abcde" 的子序列。两个字符串的「公共子序列」
是这两个字符串所共同拥有的子序列。

Si las dos cadenas no tienen una subsecuencia común, se devuelve 0.

Ejemplo 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace",它的长度为 3

Ejemplo 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc",它的长度为 3

Ejemplo 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0

rápido:

1 <= text1.length <= 1000
1 <= text2.length <= 1000
输入的字符串只含有小写英文字符。

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/longest-common-subsequence
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Ideas para resolución de problemas:
¿Qué tal DP? ¿Qué establecemos para el título. Dado que son dos cadenas, configuraremos una matriz bidimensional dp [i] [j], que representa los primeros i caracteres del primer carácter y el segundo La subsecuencia más larga que puede estar formada por los primeros j caracteres de los caracteres. El ejemplo muestra que la subsecuencia puede ser discontinua, por lo que la afirmación más larga dp[t1.length][t2.length].
Luego miramos el último paso,

1. ¿Qué if t1.charAt(t1.length-1)和t2.charAt(t2.length-1)不相等;
vamos a hacer? ¿Es directamente igual a dp [t1.length-1-1] [t2.length-1-1]? No, debido a que esta subsecuencia puede ser discontinua, hagamos un dibujo:Cuando la última longitud no es igual

Di que sí 不包含两者中的至少一个, ¿por qué no incluir dp [i-1] [j-1]? Es posible agregarlo a la ecuación de transición de estado, 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 más grandes iyj, más palíndromo que puede contener. Se verá claro si lo dibujas en papel. Soy vago para no dibujarlo jajajaja

2. En el caso de igualdad, directamente dp [i] [j] = dp [i-1] [j-1] +1; esto debe entenderse bien
y luego codificar:

class Solution {
    
    
    public int longestCommonSubsequence(String text1, String text2) {
    
    
            char s1[]=text1.toCharArray();
            char s2[]=text2.toCharArray();
            int x=s1.length;
            int y=s2.length;
            int dp[][]=new int[x+1][y+1];
            for(int i=1;i<=x;i++){
    
    
                for(int j=1;j<=y;j++){
    
    
                    if(s1[i-1]==s2[j-1])
                    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[x][y];
    }
}

Supongo que te gusta

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