freeCodeCamp/curriculum/challenges/portuguese/10-coding-interview-prep/rosetta-code/levenshtein-distance.md

106 lines
2.8 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

---
id: 5e4ce2eaac708cc68c1df260
title: Distância de Levenshtein
challengeType: 5
forumTopicId: 385264
dashedName: levenshtein-distance
---
# --description--
Em teoria da informação e em ciência da computação, a **distância de Levenshtein** é uma métrica para medir a quantidade de diferença entre duas sequências (ou seja, uma distância de edição). A distância de Levenshtein entre duas strings é definida como o número mínimo de edições necessárias para transformar uma sequência de caracteres em outra, com as operações de edição permitidas sendo inserção, exclusão ou substituição de um único caractere.
Exemplo:
A distância de Levenshtein entre "**kitten**" e "**sitting**" é 3, já que as três edições a seguir mudam de uma palavra para a outra e não há modo de fazer isso com menos de três edições:
<ul>
<li><strong>k</strong>itten   <strong>s</strong>itten    (substituição do 'k' pelo 's')</li>
<li>sitt<strong>e</strong>n   sitt<strong>i</strong>n    (substituição do 'e' pelo 'i')</li>
<li>sittin   sittin<strong>g</strong>    (inserção de 'g' ao final).</li>
</ul>
*A distância de Levenshtein entre "**rosettacode**" e "**raisethysword**" é de **8**.*
*A distância entre duas strings é a mesma que aquela quando ambas as strings são invertidas.*
# --instructions--
Escreva uma função que retorne a distância de Levenshtein entre duas strings dadas como parâmetros.
# --hints--
`levenshtein` deve ser uma função.
```js
assert(typeof levenshtein == 'function');
```
`levenshtein("mist", "dist")` deve retornar um número.
```js
assert(typeof levenshtein('mist', 'dist') == 'number');
```
`levenshtein("mist", "dist")` deve retornar `1`.
```js
assert.equal(levenshtein('mist', 'dist'), 1);
```
`levenshtein("tier", "tor")` deve retornar `2`.
```js
assert.equal(levenshtein('tier', 'tor'), 2);
```
`levenshtein("kitten", "sitting")` deve retornar `3`.
```js
assert.equal(levenshtein('kitten', 'sitting'), 3);
```
`levenshtein("stop", "tops")` deve retornar `2`.
```js
assert.equal(levenshtein('stop', 'tops'), 2);
```
`levenshtein("rosettacode", "raisethysword")` deve retornar `8`.
```js
assert.equal(levenshtein('rosettacode', 'raisethysword'), 8);
```
`levenshtein("mississippi", "swiss miss")` deve retornar `8`.
```js
assert.equal(levenshtein('mississippi', 'swiss miss'), 8);
```
# --seed--
## --seed-contents--
```js
function levenshtein(a, b) {
}
```
# --solutions--
```js
function levenshtein(a, b) {
var t = [], u, i, j, m = a.length, n = b.length;
if (!m) { return n; }
if (!n) { return m; }
for (j = 0; j <= n; j++) { t[j] = j; }
for (i = 1; i <= m; i++) {
for (u = [i], j = 1; j <= n; j++) {
u[j] = a[i - 1] === b[j - 1] ? t[j - 1] : Math.min(t[j - 1], t[j], u[j - 1]) + 1;
} t = u;
} return u[n];
}
```