es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Distancia de edición LeetCode

Así que estoy resolviendo esta pregunta de DISTANCIA DE EDICIÓN y antes de abordar el enfoque de DP, estoy intentando resolver esta pregunta de manera recursiva y me enfrento a un error lógico, por favor ayuda …
Aquí está mi código –

clase Solution {
public int minDistance(String word1, String word2) {
int n=word1.length();
int m=word2.length();
if(m<n)
return Solve(word1,word2,n,m);
else
return Solve(word2,word1,m,n);
}
private int Solve(String word1,String word2,int n,int m){
if(n==0||m==0)
return Math.abs(n-m);

if(word1.charAt(n-1)==word2.charAt(m-1))
    return 0+Solve(word1,word2,n-1,m-1);

else{
    //insert
    int insert = 1+Solve(word1,word2,n-1,m);

    //replace
    int replace = 1+Solve(word1,word2,n-1,m-1);

    //delete
    int delete = 1+Solve(word1,word2,n-1,m);

    int max1 = Math.min(insert,replace);
    return Math.min(max1,delete);
}

}

}

Aquí estoy verificando el último elemento de ambas cadenas, si los caracteres son iguales, entonces simplemente muevo ambas cadenas a n-1 y m-1 respectivamente.
De lo contrario,
Ahora tengo 3 casos de inserción, eliminación y reemplazo, y entre estos 3 debo encontrar un mínimo.
Si estoy reemplazando el carácter, simplemente muevo el carácter a n-1 y m-1.
Si estoy insertando el carácter, según mi lógica, creo que debería insertar el carácter al final de la cadena de menor longitud y mover el puntero a n-1 y m.
Para eliminar el elemento, creo que debería eliminar el elemento de la cadena de mayor longitud, por eso muevo el puntero a n-1 y m, pero creo que estoy cometiendo un error aquí, por favor ayuda.

Leetcode me está dando una respuesta incorrecta para word1 = “plasma” y word2 = “altruism”.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para depurar tu código, puedes utilizar algunas instrucciones de impresión para ver si los valores de tus variables y la lógica son correctos.

    En cuanto al error lógico que mencionaste, parece que tu enfoque para eliminar un carácter es incorrecto. En lugar de mover el puntero a n-1 y m, debes mover el puntero a n-1 y mantener la misma posición para m. Esto se debe a que estás eliminando efectivamente un carácter de word1, no de word2.

    Entonces, la línea correcta para la eliminación sería:

    //eliminar
    int eliminar = 1+Solve(word1,word2,n-1,m);
    

    Además, en cuanto a tu enfoque para la inserción, no es necesario insertar siempre al final de la cadena más pequeña. Puedes insertar en cualquier posición entre las dos cadenas, por lo que deberías probar todas las posibilidades y encontrar el mínimo al igual que haces para la eliminación y la sustitución.

    Finalmente, ten en cuenta que el enfoque recursivo puede llevar mucho tiempo y memoria para cadenas más largas, por lo que el enfoque de programación dinámica puede ser mejor en esos casos.

Comments are closed.