Subsecuencia común más larga (establecimiento correcto de una matriz bidimensional de Python)

pregunta leetcode 1143

 Aquí elegimos usar programación dinámica para resolver el problema, y ​​las dos cadenas eligen usar matrices bidimensionales para resolver (para el problema de programación dinámica de dos cadenas, en términos generales, se requiere una matriz dp bidimensional)

texto2 = 'babcde' texto1 = 'as'

0 1 2 3 4 5 6
 " " b a b C d mi
0 " " 0 0 0 0 0 0 0
1 a 0 0 1 1 1 1 1
2 C 0 0 1 1 2 2 2
3 mi 0 0 1 1 2 2 3

En cuanto a por qué se debe insertar un carácter nulo delante de cada cadena, mi entendimiento personal es que se hace deliberadamente para facilitar el uso de los datos circundantes para recuperar al implementar el algoritmo. Es decir, para text1[0] y text[0], su subsecuencia común más larga (LCS) es dp[1][1] y, a la inversa, el significado de dp[2][4]=2 es For ' ac' y 'babc', su longitud LCS es 2.

El código específico es el siguiente:

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        def dp(i,j):
            if i ==-1 or j ==-1:
                return 0
            if text1[i]==text2[j]:
                return dp(i-1,j-1)+1
            else:
                return max(dp((i-1),j),dp(i,(j-1)))
        return dp(len(text1)-1,len(text2)-1)

El código anterior se implementa mediante recursividad, por lo que la complejidad del tiempo es demasiado alta y no puede pasar los requisitos de prueba, por lo que los datos se pueden guardar en forma de notas para evitar cálculos redundantes y reducir la complejidad del tiempo.

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:

        m = len(text1) #列
        n = len(text2) #行
        dp = [[0] * (m+1) for _ in range(n+1)] #避免在同一行进行操作
        #我们知道一维数组可以用 [0] * N 这种声明方式。但是二维数组不能用上面的声明方式,这会导致                 
        #dp 中的每行的列表是同一个 id,所以对其中一行的操作都会表现为每一行的操作
        for i in range(1,n+1):
            for j in range(1,m+1):
                if text1[j-1]==text2[i-1]:
                    print(text2[i-1],text1[j-1])
                    dp[i][j]=dp[i-1][j-1]+1
                else:
                    dp[i][j]=max(dp[i][j-1],dp[i-1][j])   
        print(dp)    
        return dp[n][m]

Encontré un problema al escribir el código anterior. Lo registraré aquí. Al formar una matriz bidimensional en Python, no se puede formar una matriz unidimensional de acuerdo con la rutina de formar una matriz unidimensional. Esto causará cálculos realizarse en la misma línea cada vez, lo que arroja resultados incorrectos. Debe utilizar un bucle for para generar una matriz bidimensional que sea la matriz correcta.

Acabo de empezar a aprender sobre problemas de programación dinámica, lo que se utiliza para registrar algunos problemas que he encontrado.

Supongo que te gusta

Origin blog.csdn.net/zhaodongdz/article/details/122905717
Recomendado
Clasificación