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!