Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Minha resolução para o exercício do palíndromo

Pesquisando, descobri que era possível remover qualquer tipo de acentuação em uma frase utilizando .normalize e .replace.

Decidi implementar no meu código para que fosse possível, por exemplo, escrever frases maiores, com acentos, hífens, etc.:

let palavra = "Socorram-me, subi no ônibus em Marrocos";

let palavraAtualizada = palavra
  .replace(/\s/g, "")
  .toLowerCase()
  .normalize("NFD")
  .replace(/[\u0300-\u036f]/g, "")
  .replace(/[^\w\s]/g, "");
  
let palavraInvertida = "";

for (let i = palavraAtualizada.length - 1; i >= 0; i--) {
  palavraInvertida += palavraAtualizada[i];
}

let resultado =
  palavraAtualizada === palavraInvertida
    ? `${palavra} é um palíndromo`
    : `${palavra} não é um palíndromo`;

console.log(resultado);
2 respostas
solução!

Olá, Diego. Como vai?

Sensacional a sua solução! Você foi além do básico ao pesquisar como tratar strings de forma robusta. Lidar com palíndromos que envolvem frases inteiras (como o clássico exemplo do ônibus em Marrocos) exige exatamente esse tipo de "limpeza" dos dados para que a lógica funcione corretamente.

O uso do .normalize("NFD") combinado com o .replace(/[\u0300-\u036f]/g, "") é a forma mais profissional de remover acentos em JavaScript, pois ele decompõe os caracteres acentuados e remove apenas o sinal gráfico.

Para agregar ainda mais valor ao seu código, gostaria de destacar alguns pontos técnicos interessantes:

1. Entendendo a Regex de Pontuação
Você utilizou .replace(/[^\w\s]/g, ""). Em JavaScript, o \w representa caracteres alfanuméricos (letras e números), e o ^ dentro dos colchetes serve como uma negação. Ou seja, você está dizendo: "remova tudo o que NÃO for letra ou número". Isso é excelente para eliminar hífens e vírgulas.

2. Otimização com Métodos de Array
Embora o laço for invertido que você criou funcione perfeitamente, o JavaScript oferece uma forma muito "limpa" de inverter strings transformando-as em arrays. Veja como ficaria essa alternativa:

let palavraInvertida = palavraAtualizada.split('').reverse().join('');
  • split(''): Transforma a string em uma lista de caracteres.
  • reverse(): Inverte a ordem dos itens da lista.
  • join(''): Junta tudo novamente em uma única string.

3. Complexidade de Tempo
O seu laço for percorre a palavra uma vez (O(n)). Em frases muito longas, uma técnica de otimização comum para palíndromos é usar dois ponteiros (um no início e outro no fim) que caminham para o centro e comparam as letras. Se encontrarem uma diferença, o laço para na hora, economizando processamento.

Exemplo da lógica de dois ponteiros:

let ehPalindromo = true;
for (let i = 0; i < palavraAtualizada.length / 2; i++) {
    if (palavraAtualizada[i] !== palavraAtualizada[palavraAtualizada.length - 1 - i]) {
        ehPalindromo = false;
        break;
    }
}

Parabéns pela curiosidade e por implementar uma solução tão completa. Esse tipo de tratamento de texto é uma habilidade valiosa no dia a dia do desenvolvimento Front-end!

Espero que possa ter lhe ajudado!

Olá, Evandro. Espero que esteja bem!

Sua resposta foi extremamente esclarecedora; muito obrigado pela ajuda e atenção. Consegui compreender perfeitamente como funciona a Regex de Pontuação utilizada no código para o exercício do palíndromo.

Muito interessante saber que seria possível utilizar .split('').reverse().join('') para otimizar o código. Já conhecia essa funcionalidade por conta dos estudos sobre arrays, mas acabei não colocando em prática nesse código. De qualquer forma, agradeço bastante por apresentar essa alternativa.

Não tinha conhecimento sobre (O(n)) e a lógica de dois ponteiros. Com o exemplo, entretanto, consegui compreender como seria possível utilizá-la. É sempre válido aprender novas funcionalidades.

Tenha um excelente dia!