题目描述:

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

解析:
1.检查是否为空数组
2.遍历所有字符串,然后建立一个长度为26的数组,起始值为0。
将字母出现的频率放到数组的对应位置里(利用ascii码)
3.遍历数组,按照相同字母出现频率进行分组归类(使用hashmap)
4.遍历map,将结果返回

Java:

public List<List<String>> groupAnagrams(String[] strs) {
        if(strs.length == 0) {
            return new ArrayList();
        }
        HashMap<String, List> map = new HashMap<String, List>();
        int[] characters = new int[26];
        for(String str : strs) {
            Arrays.fill(characters, 0);
            for(int i = 0; i < str.length(); i++) {
                int ascii = str.charAt(i) - 97;
                characters[ascii]++;
            }
            StringBuilder sb = new StringBuilder("");
            for(int i = 0; i < 26;i++) {
                sb.append(characters[i]);
            }
            String key = sb.toString();
            if(!map.containsKey(key)) {
                map.put(key, new ArrayList<>());
            }
            map.get(key).add(str);
        }
        return new ArrayList(map.values());
    }

JavaScript:

var groupAnagrams = function(strs) {
    if(strs.length === 0) {
        return [];
    }
    const map = new Map();
    for(const str of strs) {
        const characters = Array(26).fill(0);
        for(let i = 0; i < str.length; i++) {
            const ascii = str.charCodeAt(i) - 97;
            characters[ascii]++;
        }
        const key = characters.join("");
        if(map.has(key)) {
            map.set(key, [...map.get(key), str]);
        } else {
            map.set(key, [str]);
        }
    }
    const result = [];
    for(const arr of map) {
        result.push(arr[1]);
    }
    return result;
};