Campamento de entrenamiento de algoritmo de registro aleatorio de código Día 56 || ● 583. Operación de eliminación de dos cadenas ● 72. Editar distancia

Hoy hemos entrado en contacto con la distancia real, pero podemos acercarnos a ella añadiendo, eliminando y modificando.

Pregunta 1: 583. Operación de eliminación de dos cadenas - LeetCode

Dada  word1 la suma  de dos palabras word2 , devuelva  el número mínimo de pasos necesarios para que la suma sea word1 la   misma .word2 

Cada paso  puede eliminar un carácter en cualquier cadena.

Idea: La clave de esta pregunta es comprender la eliminación. La operación de eliminación es un paso adicional, que se deriva del estado anterior. En primer lugar, dp [i] [j] todavía representa el número de pasos necesarios de s [i] a t [j], y durante la inicialización, es necesario eliminar elementos de 0 a s [i], por lo que es i . Es fácil encontrar que dp se puede obtener mediante dp [i-1] j-1], dp [i-1] [j], p [i] [j-1] mediante observación, el código es el siguiente:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
        for(int i = 0;i <= word1.size();i++) dp[i][0] = i;
        for(int j = 0;j <= word2.size();j++) dp[0][j] = j;
        for(int i = 1; i <= word1.size();i++){
            for(int j = 1;j <= word2.size();j++){
                if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
                else dp[i][j] = min(dp[i][j-1]+1,dp[i-1][j]+1);
            }
        }
        return dp[word1.size()][word2.size()]; 
    }

};

Problema 2: 72. Editar distancia - LeetCode

Dadas dos palabras  word1 y  word2devuelve   el número mínimo de operaciones que se utilizarán para word1 convertirlas word2   .

Puede realizar las siguientes tres operaciones en una palabra:

  • insertar un caracter
  • eliminar un personaje
  • reemplazar un personaje

Idea: Tan pronto como surgió esta pregunta, busqué la ley y no intenté entender realmente cómo reemplazar las operaciones de suma, eliminación y modificación. También fui descuidado al dibujar la matriz de ejemplo, lo que llevó a la ley equivocada al final. De hecho, no existen rutinas para este tipo de tema, solo piense en cómo operar los cambios permitidos por el tema, el código específico es el siguiente:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
        for(int i = 0;i < word1.size();i++) dp[i][0] = i;
        for(int j = 0;j <= word2.size();j++) dp[0][j] = j;
        for(int i = 1;i <= word1.size();i++){
            for(int j = 1;j<=word2.size();j++){
                if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
                else dp[i][j] = min({dp[i][j-1],dp[i-1][j],dp[i-1][j-1]}) + 1;
            }
        }
        return dp[word1.size()][word2.size()];
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_56969073/article/details/132686322
Recomendado
Clasificación