Artigo original: Three Ways to Find the Longest Word in a String in JavaScript

Este artigo é baseado no desafio de algoritmos "Encontre a maior palavra em uma string", do FreeCodeCamp.

Neste algoritmo, queremos verificar cada palavra e contar quantas letras há em cada uma. Depois disso, comparamos as contagens para determinar qual palavra tem mais caracteres e retornamos o comprimento da maior palavra.

Neste artigo, vou explicar três abordagens. A primeira usará um laço FOR, a segunda usará o método sort() e a terceira usará o método reduce().

Desafio de algoritmos

Retorne o comprimento da maior palavra na frase selecionada.

Sua resposta deve ser um número.

Casos de testes fornecidos

  • findLongestWord("The quick brown fox jumped over the lazy dog") deve retornar um número
  • findLongestWord("The quick brown fox jumped over the lazy dog") deve retornar 6
  • findLongestWord("May the force be with you") deve retornar 5
  • findLongestWord("Google do a barrel roll") deve retornar 6
  • findLongestWord("What is the average airspeed velocity of an unladen swallow") deve retornar 8
  • findLongestWord("What if we try a super-long word such as otorhinolaryngology") deve retornar 19
function findLongestWord(str) {
  return str.length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

1. Encontrar a maior palavra com um laço FOR

Para esta solução, usaremos o método String.prototype.split()

O método split() divide um objeto de string em um array de strings, separando-as em substrings.

Vamos precisar adicionar um espaço em branco entre os parênteses do método split(),

var strSplit = "The quick brown fox jumped over the lazy dog".split(' ');

que gerará como saída um array de palavras separadas:

var strSplit = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];

Se você não adicionar o espaço entre os parênteses, você obterá essa saída:

var strSplit = 
["T", "h", "e", " ", "q", "u", "i", "c", "k", " ", "b", "r", "o", "w", "n", " ", "f", "o", "x", " ", "j", "u", "m", "p", "e", "d", " ", "o", "v", "e", "r", " ", "t", "h", "e", " ", "l", "a", "z", "y", " ", "d", "o", "g"];
function findLongestWord(str) {
  // Passo 1. Dividir a string em um array de strings
  var strSplit = str.split(' ');
  // var strSplit = "The quick brown fox jumped over the lazy dog".split(' ');
  // var strSplit = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];
	
  // Passo 2. Iniciar uma variável que contenha o tamanho da maior palavra
  var longestWord = 0;

  // Passo 3. Criar o laço FOR
  for(var i = 0; i < strSplit.length; i++){
    if(strSplit[i].length > longestWord){ // Se strSplit[i].length for maior do que a palavra com a qual ela se compara...
	longestWord = strSplit[i].length; // ...longestWord recebe esse novo valor
     }
  }
  /* Aqui, strSplit.length = 9
     Para cada iteração: i = ?   i < strSplit.length?   i++  if(strSplit[i].length > longestWord)?   longestWord = strSplit[i].length
     1a iteração:        0             sim             1   if("The".length > 0)? => if(3 > 0)?     longestWord = 3
     2a iteração:        1             sim             2   if("quick".length > 3)? => if(5 > 3)?   longestWord = 5   
     3a iteração:        2             sim             3   if("brown".length > 5)? => if(5 > 5)?   longestWord = 5   
     4a iteração:        3             sim             4   if("fox".length > 5)? => if(3 > 5)?     longestWord = 5  
     5a iteração:        4             sim             5   if("jumped".length > 5)? => if(6 > 5)?  longestWord = 6 
     6a iteração:        5             sim             6   if("over".length > 6)? => if(4 > 6)?    longestWord = 6 
     7a iteração:        6             sim             7   if("the".length > 6)? => if(3 > 6)?     longestWord = 6
     8a iteração:        7             sim             8   if("lazy".length > 6)? => if(4 > 6)?    longestWord = 6 
     9a iteração:        8             sim             9   if("dog".length > 6)? => if(3 > 6)?     longestWord = 6 
     10a iteração:       9             não               
     Fim do laço FOR*/

  //Passo 4. Retornar o tamanho da maior palavra
  return longestWord; // 6
}

findLongestWord("The quick brown fox jumped over the lazy dog");

Sem comentários:

function findLongestWord(str) {
  var strSplit = str.split(' ');
  var longestWord = 0;
  for(var i = 0; i < strSplit.length; i++){
    if(strSplit[i].length > longestWord){
	longestWord = strSplit[i].length;
     }
  }
  return longestWord;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

2. Encontrar a maior palavra com o método sort()

Para esta solução, usaremos o método Array.prototype.sort() para ordenar o array por algum critério e retornaremos o tamanho do primeiro elemento do array.

  • O método sort() orderna os elementos em um array na hora e, então, o retorna.

No nosso caso, se apenas ordenarmos o array:

var sortArray = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"].sort();

a saída será:

var sortArray = ["The", "brown", "dog", "fox", "jumped", "lazy", "over", "quick", "the"];

Em Unicode, números vêm antes de letras maiúsculas, e essas últimas vêm antes das letras minúsculas.

Precisamos de algum critério para ordenar os elementos:

[].sort(function(firstElement, secondElement) {     return secondElement.length — firstElement.length; })

Esse critério será comparar o comprimento do segundo elemento com o do primeiro.

function findLongestWord(str) {
  // Passo 1. Dividir a string em um array de strings
  var strSplit = str.split(' ');
  // var strSplit = "The quick brown fox jumped over the lazy dog".split(' ');
  // var strSplit = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];
  
  // Passo 2. Ordenar os elementos no array
  var longestWord = strSplit.sort(function(a, b) { 
    return b.length - a.length;
  });
  /* Processo de ordenação
    a           b            b.length     a.length     var longestWord
  "The"      "quick"            5            3         ["quick", "The"]
  "quick"    "brown"            5            5         ["quick", "brown", "The"]  
  "brown"    "fox"              3            5         ["quick", "brown", "The", "fox"]
  "fox"      "jumped"           6            3         ["jumped", quick", "brown", "The", "fox"]
  "jumped"   "over"             4            6         ["jumped", quick", "brown", "over", "The", "fox"]
  "over"     "the"              3            4         ["jumped", quick", "brown", "over", "The", "fox", "the"]
  "the"      "lazy"             4            3         ["jumped", quick", "brown", "over", "lazy", "The", "fox", "the"]
  "lazy"     "dog"              3            4         ["jumped", quick", "brown", "over", "lazy", "The", "fox", "the", "dog"]
  */
  
  // Step 3. Retornar o tamanho do rprimeiro elemento do array
  return longestWord[0].length; // var longestWord = ["jumped", "quick", "brown", "over", "lazy", "The", "fox", "the", "dog"];
                                // longestWord[0]="jumped" => jumped".length => 6
}

findLongestWord("The quick brown fox jumped over the lazy dog");

Sem comentários:

function findLongestWord(str) {
  var longestWord = str.split(' ').sort(function(a, b) { return b.length - a.length; });
  return longestWord[0].length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

3. Encontrar a maior palavra com o método reduce()

Para esta solução, usaremos o método Array.prototype.reduce().

  • O método reduce() aplica a função com um acumulador e cada valor do array (da esquerda para a direita) para reduzi-lo a um único valor.

reduce() executa uma função de callback uma vez para cada elemento do array.

Você pode providenciar um valor inicial como o segundo parâmetro a reduzir. Aqui, adicionaremos uma string vazia "".

[].reduce(function(previousValue, currentValue) {...}, "");
function findLongestWord(str) {
  // Passo 1. Dividir a string em um array de strings
  var strSplit = str.split(' ');
  // var strSplit = "The quick brown fox jumped over the lazy dog".split(' ');
  // var strSplit = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];

  // Step 2. Usar o método reduce
  var longestWord = strSplit.reduce(function(longest, currentWord) {
    if(currentWord.length > longest.length)
       return currentWord;
    else
       return longest;
  }, "");
  
  /* Processo de reduce
  currentWord      longest       currentWord.length     longest.length    if(currentWord.length > longest.length)?   var longestWord
  "The"             ""                  3                     0                              yes                          "The"
  "quick"           "The"               5                     3                              yes                         "quick"
  "brown"           "quick"             5                     5                              no                          "quick"
  "fox"             "quick"             3                     5                              no                          "quick"
  "jumped"          "quick"             6                     5                              yes                         "jumped"
  "over"            "jumped"            4                     6                              no                          "jumped"
  "the"             "jumped"            3                     6                              no                          "jumped"
  "lazy"            "jumped"            4                     6                              no                          "jumped"
  "dog"             "jumped"            3                     6                              no                          "jumped"
  */
  
  // Passo 3. Retornar o tamanho de longestWord
  return longestWord.length; // var longestWord = "jumped" 
                             // longestWord.length => "jumped".length => 6
}

findLongestWord("The quick brown fox jumped over the lazy dog");

Sem comentários:

function findLongestWord(str) {
  var longestWord = str.split(' ').reduce(function(longest, currentWord) {
    return currentWord.length > longest.length ? currentWord : longest;
  }, "");
  return longestWord.length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

Espero que este artigo tenha sido útil. Ele é parte da minha série de artigos "Como resolver os desafios de algoritmos do freeCodeCamp", onde eu proponho diversas soluções e explico passo a passo o que acontece por baixo dos panos.

Alguns outros artigos desta série:

Três maneiras de repetir uma string em JavaScript (ainda não traduzido)

Duas maneiras de confirmar o fim de uma string em JavaScript (ainda não traduzido)

Três maneiras de colocar a primeira letra de todas as palavras de uma string em maiúsculas em JavaScript (ainda não traduzido)

Três maneiras de inverter uma string em JavaScript

Três maneiras de encontrar o fatorial de um número em JavaScript

Duas maneiras de conferir palíndromos em JavaScript

Três maneiras de encontrar o maior número em um array em JavaScript

Você pode seguir a autora no Medium, no Twitter, no Github e no LinkedIn 😜

‪#‎StayCurious‬, ‪#‎KeepOnHacking‬ e ‪#‎MakeItHappen‬!

Recursos