Tabla de contenido
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
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