algorithms · go · data-structures · leetcode-solution · algorithms-data-structures
Desbloqueando la unicidad: dominando el algoritmo de caracteres únicos en Go
¡Hola, entusiasta de Go! Hoy vamos a cubrir un nuevo algoritmo en Go.
Esta es una pregunta habitual en entrevistas para posiciones de nivel inicial, ya que cubre fundamentos de Go como maps, runes y manipulación de strings. Vamos a explorar cómo determinar si todos los caracteres de un string son únicos.
Planteamiento del problema
Como venimos haciendo, empecemos por entender el planteamiento del problema.
Implementar un algoritmo para determinar si un string contiene solo caracteres únicos.
Desglosando el planteamiento, tenemos un string como input, necesitamos procesar cada carácter del string para determinar si alguno se repite, y finalmente devolver un booleano como output.
Ahora que ya establecimos nuestro input, proceso y output, definamos el algoritmo para resolverlo.
Algoritmo para resolverlo
El primer paso es inicializar una estructura de datos que contenga cada carácter y registre sus apariciones. En Go, tenemos maps para este propósito. Usando la función incorporada make, declaremos nuestro conjunto de caracteres.
Cuando se usa con maps, esta función espera un solo argumento: el tipo del map. Aquí estamos declarando un map de runes con valores bool para registrar la aparición de cada carácter.
charMap := make(map[rune]bool)
A continuación, utilizando la elegante sintaxis del for-range de Go, iteramos sobre cada carácter del string.
for _, c := range s {} //s is the input string
Aquí es donde ocurre la magia: si c ya está en charMap, devolvemos false porque ese carácter ya apareció antes en el string.
if charMap[c] {
return false
}
Si el carácter todavía no está en charMap, lo agregamos para registrarlo en iteraciones futuras.
charMap[c] = true
Finalmente, si el loop termina sin encontrar ninguna repetición, significa que todos los caracteres son únicos, así que devolvemos true.
return true
¡Y listo! Resolvimos el algoritmo de caracteres únicos. Aquí van algunos casos de prueba para verificar la solución:
-
abcdef→ devuelvetrueporque no contiene caracteres repetidos. -
hello→ devuelvefalseporque contiene una letra repetida,l
Reflexiones finales
Vamos aumentando gradualmente la dificultad de los algoritmos en esta serie. Como he venido remarcando, hay que fortalecer los fundamentos antes de enfrentar desafíos más complejos. Como dice el dicho: “hay que aprender a caminar antes de correr”.
Así que a seguir practicando, y ojalá se acuerden de este blog cuando llegue ese trabajo tan buscado. Como siempre, este y otros algoritmos en Go y TypeScript están disponibles en mi repo de GitHub de algoritmos: https://github.com/RubenOAlvarado/algorithms
¡Hasta la próxima!