Dos formas de buscar palíndromos en JavaScript

Este artículo se basa en el Scripting del algoritmo básico de Free Code Camp "Comprobar palíndromos".

Un palíndromo es una palabra, frase, número u otra secuencia de caracteres que se lee igual hacia adelante o hacia atrás. La palabra "palíndromo" fue acuñada por primera vez por el dramaturgo inglés Ben Jonson en el siglo XVII, de las raíces griegas palin ("otra vez") y dromos ("camino, dirección"). - src. Wikipedia

En este artículo, voy a explicar dos enfoques, primero con funciones integradas y segundo usando un bucle for.

Desafío del algoritmo

Devuelve verdadero si la cadena dada es un palíndromo. De lo contrario, devuelve falso.

Un palíndromo es una palabra u oración que se escribe de la misma manera tanto hacia adelante como hacia atrás, ignorando la puntuación, el uso de mayúsculas y minúsculas y los espacios.

Nota. Deberá eliminar todos los caracteres no alfanuméricos (puntuación, espacios y símbolos) y convertir todo en minúsculas para buscar palíndromos.

Pasaremos cadenas con diferentes formatos, como “racecar”, “RaceCar” y “race CAR” entre otros.

function palindrome(str) { return true; } palindrome("eye");

Casos de prueba proporcionados

  • palíndromo ("coche de carreras") debería devolver verdadero
  • palíndromo ("no es un palíndromo")debe devolver falso
  • palíndromo ("Un hombre, un plan, un canal. Panamá") debe volver verdadero
  • palíndromo ("nunca par ni impar") debe devolver verdadero
  • palíndromo ("no") debe devolver falso
  • palíndromo ("almostomla") debe devolver falso
  • palíndromo ("Mi edad es 0, 0 si ega ym") debe devolver verdadero
  • palíndromo ("1 ojo por 1 ojo") debe devolver falso
  • palíndromo ("0_0 (: / - \ :) 0–0") debería devolver verdadero

¿Qué expresión regular necesitaremos para aprobar el último caso de prueba?

Las expresiones regulares son patrones que se utilizan para hacer coincidir combinaciones de caracteres en cadenas.

Cuando la búsqueda de una coincidencia requiere algo más que una coincidencia directa, el patrón incluye caracteres especiales.

To pass the last test case, we can use two Regular Expressions: /[^A-Za-z0–9]/g or /[\W_]/g

\ W elimina todos los caracteres no alfanuméricos :

  • \ W coincide con cualquier carácter que no sea una palabra
  • \ W es equivalente a [^ A-Za-z0–9_]
  • \ W coincide con cualquier cosa que no esté entre corchetes

Qué significa eso?

[^A-Z] matches anything that is not enclosed between A and Z [^a-z] matches anything that is not enclosed between a and z [^0-9] matches anything that is not enclosed between 0 and 9 [^_] matches anything that does not enclose _

Pero en nuestro caso de prueba, necesitamos palíndromo (“ 0_0 (: / - \ :) 0–0 ”) para devolver verdadero , lo que significa que “ _ (: / - \ :) - ” debe coincidir.

Necesitaremos agregar " _ " para aprobar este caso de prueba específico.

We now have “\W_”

También necesitaremos agregar la bandera g para la búsqueda global.

We finally have “/[\W_]/g”
/ [\ W _] / g se usó con fines puramente demostrativos para mostrar cómo funciona RegExp. / [^ A-Za-z0–9] / g es la expresión regular más fácil de elegir .

1. Compruebe si hay palíndromos con funciones integradas

Para esta solución, usaremos varios métodos:

  • El método toLowerCase () para devolver el valor de la cadena de llamada convertido a minúsculas.
  • El método replace () para devolver una nueva cadena con algunas o todas las coincidencias de un patrón reemplazadas por un reemplazo. Usaremos una de las RegExp que acabamos de crear anteriormente.
  • El método split () divide un objeto String en una matriz de cadenas al separar la cadena en subcadenas.
  • El método reverse () invierte una matriz en su lugar. El primer elemento de la matriz se convierte en el último y el último en el primero.
  • El método join () une todos los elementos de una matriz en una cadena.
function palindrome(str) { // Step 1. Lowercase the string and use the RegExp to remove unwanted characters from it var re = /[\W_]/g; // or var re = /[^A-Za-z0-9]/g; var lowRegStr = str.toLowerCase().replace(re, ''); // str.toLowerCase() = "A man, a plan, a canal. Panama".toLowerCase() = "a man, a plan, a canal. panama" // str.replace(/[\W_]/g, '') = "a man, a plan, a canal. panama".replace(/[\W_]/g, '') = "amanaplanacanalpanama" // var lowRegStr = "amanaplanacanalpanama"; // Step 2. Use the same chaining methods with built-in functions from the previous article 'Three Ways to Reverse a String in JavaScript' var reverseStr = lowRegStr.split('').reverse().join(''); // lowRegStr.split('') = "amanaplanacanalpanama".split('') = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"] // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].reverse() = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"] // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].join('') = "amanaplanacanalpanama" // So, "amanaplanacanalpanama".split('').reverse().join('') = "amanaplanacanalpanama"; // And, var reverseStr = "amanaplanacanalpanama"; // Step 3. Check if reverseStr is strictly equals to lowRegStr and return a Boolean return reverseStr === lowRegStr; // "amanaplanacanalpanama" === "amanaplanacanalpanama"? => true } palindrome("A man, a plan, a canal. Panama");

Sin comentarios:

function palindrome(str) { var re = /[\W_]/g; var lowRegStr = str.toLowerCase().replace(re, ''); var reverseStr = lowRegStr.split('').reverse().join(''); return reverseStr === lowRegStr; } palindrome("A man, a plan, a canal. Panama");

2. Compruebe si hay palíndromos con un bucle FOR

La indexación a la mitad (len / 2) tiene ventajas al procesar cadenas grandes. Comprobamos el final de cada parte y dividimos el número de iteraciones dentro del ciclo FOR por dos.

function palindrome(str) { // Step 1. The first part is the same as earlier var re = /[^A-Za-z0-9]/g; // or var re = /[\W_]/g; str = str.toLowerCase().replace(re, ''); // Step 2. Create the FOR loop var len = str.length; // var len = "A man, a plan, a canal. Panama".length = 30 for (var i = 0; i < len/2; i++) { if (str[i] !== str[len - 1 - i]) { // As long as the characters from each part match, the FOR loop will go on return false; // When the characters don't match anymore, false is returned and we exit the FOR loop } /* Here len/2 = 15 For each iteration: i = ? i  if("a" !== "a")? // false 2nd iteration: 1 yes 2 if(str[1] !== str[15 - 1 - 1])? => if("m" !== "m")? // false 3rd iteration: 2 yes 3 if(str[2] !== str[15 - 1 - 2])? => if("a" !== "a")? // false 4th iteration: 3 yes 4 if(str[3] !== str[15 - 1 - 3])? => if("n" !== "n")? // false 5th iteration: 4 yes 5 if(str[4] !== str[15 - 1 - 4])? => if("a" !== "a")? // false 6th iteration: 5 yes 6 if(str[5] !== str[15 - 1 - 5])? => if("p" !== "p")? // false 7th iteration: 6 yes 7 if(str[6] !== str[15 - 1 - 6])? => if("l" !== "l")? // false 8th iteration: 7 yes 8 if(str[7] !== str[15 - 1 - 7])? => if("a" !== "a")? // false 9th iteration: 8 yes 9 if(str[8] !== str[15 - 1 - 8])? => if("n" !== "n")? // false 10th iteration: 9 yes 10 if(str[9] !== str[15 - 1 - 9])? => if("a" !== "a")? // false 11th iteration: 10 yes 11 if(str[10] !== str[15 - 1 - 10])? => if("c" !== "c")? // false 12th iteration: 11 yes 12 if(str[11] !== str[15 - 1 - 11])? => if("a" !== "a")? // false 13th iteration: 12 yes 13 if(str[12] !== str[15 - 1 - 12])? => if("n" !== "n")? // false 14th iteration: 13 yes 14 if(str[13] !== str[15 - 1 - 13])? => if("a" !== "a")? // false 15th iteration: 14 yes 15 if(str[14] !== str[15 - 1 - 14])? => if("l" !== "l")? // false 16th iteration: 15 no End of the FOR Loop*/ } return true; // Both parts are strictly equal, it returns true => The string is a palindrome } palindrome("A man, a plan, a canal. Panama");

Sin comentarios:

function palindrome(str) { var re = /[^A-Za-z0-9]/g; str = str.toLowerCase().replace(re, ''); var len = str.length; for (var i = 0; i < len/2; i++) { if (str[i] !== str[len - 1 - i]) { return false; } } return true; } palindrome("A man, a plan, a canal. Panama");

Espero que hayas encontrado esto util. Esto es parte de mi serie de artículos “Cómo resolver algoritmos de FCC” sobre los desafíos de algoritmos de Free Code Camp, donde propongo varias soluciones y explico paso a paso lo que sucede bajo el capó.

Dos formas de confirmar el final de una cadena en JavaScript

En este artículo, explicaré cómo resolver el desafío "Confirmar el final" de freeCodeCamp.

Tres formas de invertir una cadena en JavaScript

Este artículo se basa en la secuencia de comandos del algoritmo básico de Free Code Camp "Reverse una cadena"

Tres formas de factorializar un número en JavaScript

Este artículo se basa en la secuencia de comandos del algoritmo básico de Free Code Camp "Factorializar un número"

Tres formas de encontrar la palabra más larga de una cadena en JavaScript

Este artículo se basa en la secuencia de comandos del algoritmo básico de Free Code Camp "Encuentra la palabra más larga en una cadena".

Tres formas de poner un título a una oración en JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Title Case a Sentence”.

Three ways you can find the largest number in an array using JavaScript

In this article, I’m going to explain how to solve Free Code Camp’s “Return Largest Numbers in Arrays” challenge. This…

If you have your own solution or any suggestions, share them below in the comments.

Or you can follow me on Medium, Twitter, Github and LinkedIn, right after you click the green heart below ;-)

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

Resources

  • Regular Expressions — MDN
  • toLowerCase() method — MDN
  • replace() — MDN
  • split() method — MDN
  • reverse() method — MDN
  • join() method — MDN
  • String.length — MDN
  • for — MDN