class Solution {
    fun groupAnagrams(strs: Array<String>): List<List<String>> {
        val keyInputMap = mutableMapOf<String, MutableList<String>>()
        
        for (str in strs) {
            val key = generateAnagramKey(str)
            
            if (keyInputMap.containsKey(key)) {
                keyInputMap[key]!!.add(str)
            } else {
                keyInputMap[key] = mutableListOf(str)
            }
        }
        
        return keyInputMap.values.toList()
    }
    
    private fun generateAnagramKey(str: String): String {
        val alphabetMap = mutableMapOf<Char, Int>()
        
        for (char in str) {
            alphabetMap[char] = alphabetMap.getOrDefault(char, 0) + 1
        }
        
        val keyStringBuilder = StringBuilder()
        for (char in 'a'..'z') {
            if (!alphabetMap.containsKey(char)) {
                continue
            }
            keyStringBuilder.append("$char:${alphabetMap[char]}")
        }
        return keyStringBuilder.toString()
    }
}