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

2.8 KiB

id title challengeType forumTopicId dashedName
5e4ce2eaac708cc68c1df260 Distância de Levenshtein 5 385264 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:

  • kitten   sitten    (substituição do 'k' pelo 's')
  • sitten   sittin    (substituição do 'e' pelo 'i')
  • sittin   sitting    (inserção de 'g' ao final).

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.

assert(typeof levenshtein == 'function');

levenshtein("mist", "dist") deve retornar um número.

assert(typeof levenshtein('mist', 'dist') == 'number');

levenshtein("mist", "dist") deve retornar 1.

assert.equal(levenshtein('mist', 'dist'), 1);

levenshtein("tier", "tor") deve retornar 2.

assert.equal(levenshtein('tier', 'tor'), 2);

levenshtein("kitten", "sitting") deve retornar 3.

assert.equal(levenshtein('kitten', 'sitting'), 3);

levenshtein("stop", "tops") deve retornar 2.

assert.equal(levenshtein('stop', 'tops'), 2);

levenshtein("rosettacode", "raisethysword") deve retornar 8.

assert.equal(levenshtein('rosettacode', 'raisethysword'), 8);

levenshtein("mississippi", "swiss miss") deve retornar 8.

assert.equal(levenshtein('mississippi', 'swiss miss'), 8);

--seed--

--seed-contents--

function levenshtein(a, b) {

}

--solutions--

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];
}