Hoy me enfrenté al desafío diario de LeetCode, que consistía en contar cuántas palabras eran «consistentes«. Una palabra se considera consistente si solo contiene letras permitidas, que son proporcionadas como parámetro.
Mi primera aproximación fue la más intuitiva: iterar por cada palabra, comprobando cada una de sus letras. Si detectaba un carácter que no estaba en el conjunto de letras permitidas, simplemente pasaba a la siguiente palabra. En caso de llegar al final sin problemas, sumaba uno al contador total de palabras consistentes.
Aunque esta solución funcionaba, me pareció algo simple. Así que decidí retomar algunas estructuras de datos menos comunes en mi día a día y opté por usar un Set. La idea era almacenar las letras permitidas en un Set y luego convertir cada palabra en un conjunto. Si todos los caracteres de la palabra estaban en el Set de letras permitidas, entonces incrementaba el contador.
A continuación, comparto el código y los resultados obtenidos. Probablemente haya formas más óptimas de resolver este problema, pero quise aprovechar para explorar y jugar con este tipo de estructura de datos.
public int countConsistentStrings(String allowed, String[] words) {
Set allowedSet = allowed.chars().mapToObj(e->(char)e).collect(Collectors.toSet());
int total = 0;
for (String word : words) {
Set currentWordSet = word.chars().mapToObj(e -> (char)e).collect(Collectors.toSet());
if (allowedSet.containsAll(currentWordSet)) ++total;
}
return total;
}
La ejecución de los escenarios de tests tardó 71 ms ocupando un 46.02MB de memoria.