La Palabra Mas Larga - FreeCodeCamp Daily Challenge
La Palabra Mas Larga - FreeCodeCamp Daily Challenge
Enunciado del Problema
Dada una cadena de texto, devuelve la palabra más larga. Reglas:
- Las palabras están separadas por espacios.
- Solo se consideran caracteres alfabéticos (a-z, sin distinguir mayúsculas).
- Si hay empate, retorna la primera palabra más larga.
- La palabra se devuelve sin signos de puntuación.
Ejemplos:
| Entrada | Salida |
|---|---|
"The quick red fox" | quick |
"Hello coding challenge." | challenge |
"Do Try This At Home." | This |
"This sentence... has commas, ellipses, and an exlamation point!" | exlamation |
"A tie? No way!" | tie |
"Wouldn't you like to know." | Wouldnt |
Análisis y Estrategia
Descomponemos el problema en pasos claros:
flowchart TB
A[Recibir frase] --> B[Dividir en palabras]
B --> C[Limpieza: quitar puntuación]
C --> D[Comparar longitud]
D --> E[Actualizar palabra más larga]
E --> F[Devolver resultado]
- División: Usamos
split(' ')para obtener las palabras. - Limpieza: Eliminamos signos de puntuación con una expresión regular.
- Comparación: Buscamos la palabra de mayor longitud.
- Retorno: Devolvemos la palabra más larga encontrada.
Solución en JavaScript
Implementación Imperativa
/**
* Encuentra la palabra más larga en una frase.
* @param {string} sentence The input sentence containing words.
* @returns {string} The longest word found in the sentence.
*/
function longestWord(sentence) {
const words = sentence.split(' ')
let longest = ''
for (let word of words) {
const cleaned = word.replace(/[^a-z]/gi, '')
if (cleaned.length > longest.length) {
longest = cleaned
}
}
return longest
}Explicación Solucion Imperativa
División:
split(' ')separa la frase en palabras.Limpieza:
replace(/[^a-zA-Z]/g, '')elimina todo lo que no sea letra.Reducción:
reducecompara la longitud de cada palabra limpia y conserva la más larga.
Esta solucion es imperativa por que utiliza un bucle explícito para iterar sobre las palabras y actualizar el estado de la variable longest. Se dice que es un bucle explicito porque el programador controla directamente la iteración y la lógica de comparación.
Implementación Funcional
function longestWord(sentence) {
return sentence
.split(' ')
.map(word => word.replace(/[^a-z]/gi, ''))
.reduce((longest, current) =>
current.length > longest.length ? current : longest, '')
}Explicación Solucion Funcional
- División:
split(' ')separa la frase en palabras. - Mapeo:
mapaplica la limpieza a cada palabra. - Limpieza:
replace(/[^a-zA-Z]/g, '')elimina todo lo que no sea letra. - Reducción:
reducecompara la longitud de cada palabra limpia y conserva la más larga. Inicializa longest como cadena vacía.
Esta solucion es funcional porque utiliza métodos de orden superior (map y reduce) para transformar y reducir los datos sin mutar el estado externo. Metodos de orden superior son funciones que toman otras funciones como argumentos. Map y reduce son ejemplos por que ambos toman funciones como argumentos para procesar los elementos de un array.
Complejidad Algorítmica
Ambas soluciones tienen la misma complejidad:
- Tiempo: , donde es la cantidad de caracteres en la frase.
- Espacio: , donde es el número de palabras.
La diferencia no esta en el rendimiento sino que radica en el estilo de programación: imperativo vs funcional.
Casos de Prueba y Edge Cases
- Frases con solo una palabra.
- Frases con múltiples palabras de igual longitud.
- Frases con signos de puntuación pegados a las palabras.
- Frases vacías (retorna cadena vacía).