【LeetCode】 583. Operación de eliminación para dos cadenas (C ++)


Fuente del tema: https://leetcode-cn.com/problems/delete-operation-for-two-strings/

Descripción del Título

Dadas dos palabras word1 y word2, encuentre el número mínimo de pasos necesarios para hacer que word1 y word2 sean iguales. Cada paso puede eliminar un carácter en cualquier cadena.

Ejemplo:

Entrada: "mar", "comer"
Salida: 2
Explicación: El primer paso cambia "mar" a "ea", y el segundo paso cambia "comer" a "ea".

Consejo:

La longitud de la palabra dada no no exceda de 500.
Los caracteres de una palabra determinada solo contienen letras minúsculas.

Idea general

  • Problemas clásicos de programación dinámica
  • Cinco pasos de programación dinámica:
    • Determine el significado de la matriz dp y los subíndices: dp [i] [j] representa la cadena de caracteres word1 que termina en i-1 y la cadena de caracteres word2 que termina en j-1
    • 确定 递推 公式 :
      dp [i] [j] = {dp [i - 1] [j - 1] (ifword 1 [i - 1] = = word 2 [j - 1]) elsemin (min (dp [i ] [j - 1] + 1, dp [i - 1] [j] + 1), dp [i - 1] [j - 1] + 2) dp [i] [j] = \ left \ {\ begin {matriz} {c} dp [i-1] [j-1] {\ quad} (si {\ quad} palabra1 [i-1] == palabra2 [j-1]) \\ else \\ min (min (dp [i] [j-1] + 1, dp [i-1] [j] +1), dp [i-1] [j-1] +2) {\ quad} \ end {matriz} \ derecho.d p [ i ] [ j ]=d p [ i-1 ] [ j-1 ]( yo fw o r d 1 [ i-1 ]= =w o r d 2 [ j-1 ] )e l s em i n ( m i n ( d p [ i ] [ j-1 ]+1 ,d p [ i-1 ] [ j ]+1 ) ,d p [ i-1 ] [ j-1 ]+2 )
  • seguir adelante
    • Cómo definir e inicializar la matriz dp
    • Determinar el orden transversal
    • Ejemplo para derivar una matriz dp
      Inserte la descripción de la imagen aquí

Programación dinámica

  • Al inicializar, necesitamos atravesar dp [i] [0] y dp [0] [j], porque este es el estado inicial de la matriz dp, es decir, para inicializar word1 o word2 como una cadena vacía
  • Tras confirmar estos cinco pasos, la idea es clara
class Solution {
    
    
public:
    int minDistance(string word1, string word2) {
    
    
        int len1 = word1.size(), len2 = word2.size();
        vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1));
        for (int i = 0 ; i <= len1 ; ++i)   dp[i][0] = i;
        for (int j = 0 ; j <= len2 ; ++j)   dp[0][j] = j;
        for (int i = 1 ; i <= len1 ; ++i){
    
    
            for (int j = 1 ; j <= len2 ; ++j){
    
    
                if (word1[i - 1] == word2[j - 1]){
    
    
                    dp[i][j] = dp[i - 1][j - 1];
                }
                else{
    
    
                    dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);
                }
            }
        }
        return dp[len1][len2];
    }
};

Análisis de complejidad

  • Complejidad del tiempo: O (m * n). n es la longitud de la matriz
  • Complejidad espacial: O (m * n). n es la longitud de la matriz, se mantiene una matriz dp bidimensional, la longitud bidimensional es la longitud de word1 y la matriz unidimensional en el bidimensional es la longitud de word2

Supongo que te gusta

Origin blog.csdn.net/lr_shadow/article/details/115003239
Recomendado
Clasificación