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 word2
, devuelve 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()];
}
};