挑战刷leetcode第五天( 字母异位词分组),你看我行吗?

97 阅读1分钟

java版

public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) {
            return null;
        }
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            int[] ints = new int[26];
            char[] chars = str.toCharArray();
            for (char c : chars) {
                ints[c - 'a']++;
            }

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 26; i++) {
                if (ints[i] == 0) {
                    continue;
                }
                sb.append((char) (i + 'a'));
                sb.append(ints[i]);
            }
            List<String> list = map.getOrDefault(sb.toString(), new ArrayList<>());
            list.add(str);
            map.put(sb.toString(), list);
        }
        return new ArrayList<List<String>>(map.values());
    <p align=right>}</p>

C++版

vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        if (strs.empty()) {
            return res;
        }
        unordered_map<string, vector<string>> map;

        for (string str : strs) {
            int ints[26] = {0};
            for (int i = 0; i < str.size(); i++) {
                ints[str[i] - 'a']++;
            }
            string key = "";
            for (int j = 0; j < 26; j++) {
                if (ints[j] == 0) {
                    continue;
                }
                key.push_back((char)(j + 'a'));
                key.push_back(ints[j]);
            }
            map[key].push_back(str);
        }
        for (auto& v : map) {
            res.push_back(v.second);
        }
        return res;
    }

总结

核心思想是通过数组来实现字母异位词的定位,对于乱序的相同字母,按照数组下标和数组的值来进行还原 然后通过数组下标和值(同一字母出现的次数)作为map的key进行组装,相同的放到一组; C++和java的基本处理思想一致,主要就是C++字符串作为数组进行push_back拼接。

打卡完成,继续坚持!!!希望友友们监督哈