[Serie Leetcode] [algoritmo] [difícil] distancia de edición (DP)

tema:

enlaces a los temas:  https://leetcode-cn.com/problems/edit-distance/

 

Ideas de resolución de problemas:

La programación dinámica, de acuerdo con el significado de las preguntas, la operación puede llevarse a cabo de la siguiente manera:

La operación se realiza:

  1. Inserción de un carácter en una
  2. Para borrar un carácter en una
  3. Modificar un personaje de una
  4. Inserción de un carácter en B
  5. Para borrar un carácter en B
  6. Modificar un personaje en B

Sin embargo, algunos de los cuales son efectos operación equivalente:

  1. Inserción de un carácter en A = B para borrar un carácter, como por ejemplo A = '12', B = '123', se inserta en un '3', B es equivalente a eliminar el '3'
  2. Inserción de un carácter en el B = A eliminar un carácter, como por ejemplo A = '123', B = '12', insert '3' en B, lo mismo que eliminar en A '3'
  3. Una modificación de un carácter en un carácter B = modificada, tal como A = '123', B = '124',

Así que al final, sólo tenemos que considerar las tres operaciones siguientes en él:

  1. Inserción de un carácter en una
  2. Inserción de un carácter en B
  3. Modificar un personaje de una

¿Por qué eligieron estos tres, en lugar de los otros tres, que va a decir

Pensar de esta manera, ponemos una gran pregunta, convertida en un pequeño problema, pero no cumple con la ecuación de transición de estado de programación dinámica, la necesidad de continuar el desmontaje, desmantelamiento de la siguiente manera:

En cada una de las operaciones anteriores, el impacto sobre el número total de operaciones es la siguiente:

  1. Inserción de un carácter en A: asumido de '123' a un '456' paso requiere una X, entonces pedir a '123' convertidor '4567' número de pasos necesarios, no más de X + 1 pasos, porque la '123' convert a '456', la única necesidad más detrás de un '7', la conversión de completa
  2. Inserción de un carácter en B: Supongamos de '123' a un '456' necesidad pasos Y, a continuación, a partir de '1234' a un '456' número de pasos necesarios, no más de Y + 1 pasos, porque la '123' convert a '456', la parte de atrás más un '4', para completar la conversión
  3. Modificar un personaje en A: asumido de '123' a un '456' pasos Z necesaria, a continuación, a partir de '1234' a un '4567' número de pasos necesarios, no más de Z + 1 pasos, porque la '123' convert a '456', la entonces sólo '4' Modificar '7', la conversión a completa

Un personaje en él desde el número de pasos deseados carácter B, se transforma en min (X + 1, Y + 1, Z + 1)

De acuerdo con la operación anterior, sólo sé que una cadena vacía en un paso muy necesario B, la entrega puede ser lanzado desde la cadena A B en un número de pasos necesarios, por eso elige solamente para agregar el carácter y la razón para modificar el funcionamiento del carácter anterior, debido a que en proceso de programación dinámica, sólo se necesita ser considerado de menos a más proceso recursivo puede ser, y no tiene por qué ser considerada de más a menos

Proceso ilustra como sigue:

Si la fila 0 representa una cadena vacía, en cadenas correspondientes posiciones '' ros que necesita para llevar a cabo operandos paso, una columna 0, representa una cadena vacía, en una posición de paso correspondiente cadena 'caballo' número. Debido a que la cadena vacía en una cadena de caracteres correspondiente, el carácter sólo puede ser insertado en la operación correspondiente, el número de operaciones es el número de caracteres, el dp inicialización [i] [0] = i, dp [0] [j] = j,

A continuación, la posición de desplazamiento [1,1], entonces [1, 1] celosía cerca de la correspondencia y la operación es como sigue:

  1. celosía izquierda [0,1] = B, insertar un carácter por los = 'carácter en un carácter' 'cambiado de' r h 'se convierte en el personaje' carácter r'
  2. Bajar celosía [1,0] = la inserción de un carácter en A = a 'h' se convierte en el carácter '' carácter cambiado de 'h' se convierte en el personaje 'carácter r'
  3. La esquina inferior izquierda de la cuadrícula [0,0] = modificar un carácter en A = a 'carácter en' carácter, cambiado de carácter 'h', se convierte en carácter 'r'

Por lo tanto, la lógica de actualización [1,1] posición dp [1] [1] = min (dp [0] [1] + 1, dp [1] [0] + 1, dp [0] [0] + 1) = 1 + min (dp [0] [1], d [1] [0], dp [1] [1]) = 1

De acuerdo con esta lógica continúa traverse:

En este momento, cuando el recorrido del siguiente carácter, se encuentran dos personajes de la misma letra, son 'O', así que para 'modificar un carácter en A' operación, es decir, la esquina inferior izquierda [1,1] procesamiento no es operaciones adicionales, esta vez se actualiza como sigue:

De acuerdo con esta lógica continúa el ciclo se deriva:

Después de la finalización de recorrido ilustra como sigue:

Como puede verse en la ilustración anterior, la ecuación de transición de estados de programación dinámica es:

dp [i] [j] = \ left \ {\ begin {matriz} 1 + min (dp [i - 1] [j], dp [i] [j - 1], dp [i - 1] [j - 1]) \ quad si A [i] \ neq B [j] \\ 1 + min (dp [i - 1] [j], dp [i] [j - 1], dp [i - 1] [j - 1] - 1) \ quad si A [i] = B [j] \ end {matriz} \ right.

Donde A [i] denota el carácter i A, B [j] es B j-ésimo carácter en

 

la implementación del código:

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m = len(word1)
        n = len(word2)
        if m * n == 0:
            return m + n
        
        dp = [[0] * (m + 1) for _ in range(n + 1)]
        
        for i in range(n + 1):
            dp[i][0] = i
            
        for j in range(m + 1):
            dp[0][j] = j
            
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                left = dp[i][j - 1] + 1
                down = dp[i - 1][j] + 1
                left_down = dp[i - 1][j - 1] + 1
                if word2[i - 1] == word1[j - 1]:
                    left_down -= 1
                    
                dp[i][j] = min(left, down, left_down)
                
        return dp[n][m]
            

 

 

 

 

 

Publicados 100 artículos originales · ganado elogios 4 · Vistas 1456

Supongo que te gusta

Origin blog.csdn.net/songyuwen0808/article/details/105408237
Recomendado
Clasificación