Si alguna vez has usado el programa Git y te has equivocado al escribir un comando, has visto que Git te da sugerencias de comandos similares que sí existen. Por ejemplo, aquí escribí comfit
en vez de commit
:
¿Pero alguna vez te has preguntado cómo está implementado?
Una posible solución es usar la distancia de Levenshtein, un concepto que fue propuesto en 1965 por el matemático ruso Vladimir Levenshtein y que nos permite medir qué tan similares o diferentes son dos strings. Más precisamente, la distancia de Levenshtein está definida de la siguiente manera:
Tenemos una string A
y una string B
. La distancia de Levenshtein entre A
y B
es el mínimo número de operaciones para transformar A
en B
, donde cada operación consiste en alguna de estas 3
alternativas:
A
;A
;A
por cualquier otro caracter (sin cambiarlo de posición).Veamos un ejemplo. Supongamos que tenemos la string inicial caos
y queremos transformarla en codeo
. Aquí hay una manera de transformarla:
En este caso usamos 4
operaciones, que de hecho es la mejor manera de hacerlo pues no es posible transformar caos
en codeo
usando 3
o menos operaciones (sin embargo, no es la única manera de hacerlo con 4
operaciones: otra manera de hacerlo es caos → caoso → caoeo → cadeo → codeo
).
Dadas dos strings A
y B
, encuentra el mínimo número de operaciones para transformar una en la otra.
La entrada contiene exactamente dos líneas:
A
;B
.Ambas strings tienen entre 1
y 1000
caracteres y sólo tienen letras mínusculas. No hay eñes, tildes, o diéresis.
La salida debe tener una sóla línea con un número, la distancia de Levenshtein entre las dos strings.
caos
codeo
4
Este es el ejemplo explicado más arriba. La distancia es 4
.
codeo
codeo
0
Si las dos strings son iguales, no necesitamos hacer ninguna operación para transformar una en la otra, por la tanto su distancia es 0
.
codeos
codeo
1
Simplemente borramos la s
.
codo
codeo
1
Simplemente insertamos la e
que falta.
codao
codeo
1
Simplemente reemplazamos la a
por e
. Otra opción sería borrar la a
y luego insertar la e
(codao → codo → codeo
) pero eso sería peor porque gastaríamos 2
operaciones en vez de 1
.
ab
ba
2
Reemplazamos la a
por la b
y la b
por la a
usando 2
operaciones: ab → bb → ba
.
interesante
inteligente
4
Sólo necesitamos 4
reemplazos en el medio para convertir resa
en lige
.
interdisciplinariedad
contradictoriamente
14
Buena suerte descifrando este.