Group Anagrams
Este es un problema un poco mas complejo, sin embargo, sirve para medir que tanto conoces los fundamentales de DSA. El problema dicta asi:
Dada una lista de strings
strsagrupa juntos las palabras que sean anagramas dentro de una lista. Finalmente, retorna una lista que contenga todas las listas de palabras que forman diferentes anagramas. Por ejemplo, dado["eat", "tea", "mae"]el resultado seria:[["eat", "tea"], ["mae"]].
# Solucion
Para resolver el problema existen dos soluciones posibles. Que pueden llegar a ser mas complejas o mas sencillas dependiendo del lenguaje que estes usando para implementar el problema.
# Utilizando Sorting
La primer solucion y la mas sencilla globalmente es utilizar un algoritmo de sorting. La solucion se ve algo asi:
- Crear un mapa que contendra como llave, un string ordenado alfabeticamente y como valor una lista de strings que encajan con dicha llave ordenada
- Iterar sobre cada uno de los strings
- Ordenar el string alfabeticamente
- En caso de que este exista como llave dentro del mapa simplemente añadir el string original (sin ordenar) al valor (lista) de dicha llave.
- En caso de que no exista la llave, agregarla al mapa inicializando la lista de valor con el string actual.
- Finalmente retornar en una lista los valores de los strings
# Codigo
| |
# Utilizando un Hashmap y el constraint de letras.
Aprovechando que el problema dicta que las letras unicamente son minusculas (limitado a 26 caracteres) podemos evitar utilizar un algoritmo de sorting y en su lugar utilizar una lista como llave, lista la cual tendra las ocurrencias de cada caracter la cantidad de veces que este ocurre y como valor nuevamente la lista de strings que encajan con dicha llave.
- Crear un mapa que contendra como llave; una lista de numeros, en la cual el index
ithcorresponde a la letra en la posiciona + ith. Por tanto: 0 = a, 1 = b, 2 = c, 3 = d, etc… y como valor la lista de strings que encajan con dicha llave - Iterar sobre cada uno de los strings
- Inicializar una lista con 26 de longitud y un valor inicial de 0 en cada uno de ellos
- Iterar sobre cada caracter, e ir actualizando la lista con las ocurrencias de cada uno
- En caso de que este exista como llave dentro del mapa simplemente añadir el string original (sin ordenar) al valor (lista) de dicha llave.
- En caso de que no exista la llave, agregarla al mapa inicializando la lista de valor con el string actual.
- Finalmente retornar en una lista los valores de los strings
# Codigo
El codigo en TypeScript es un poco tricky aqui, particularmente al:
- Inicializar el array desde el constructor del objeto global Array
- El uso del metodo toString() debido a que la comparacion en TS ocurre por referencias, siempre las referencias seran diferentes a pesar que los elementos dentro de la lista sean los mismos, es por esto que no se pueden usar como keys de un mapa.
| |