LeetCode49. 字母异位词分组

一、题目描述

☆☆☆☆二、解法

方法1:先排序,再判断。      “当且仅当它们的排序字符串相等时,两个字符串是字母异位词。”

方法2:按计数分类。       “当且仅当它们的字符计数(每个字符的出现次数)相同时,两个字符串是字母异位词。”

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        /**
         *  方法1:先排序,再判断.  时间复杂度O(NKlogK), 空间复杂度 O(NK)
         *      思路:维护一个Map,每个键是一个排序字符串,值是字符串列表list
         *      复杂度分析:N是strs的长度,K是strs中字符串的最大长度。外部循环O(N),内部排序O(KlogK)
         */
        if (strs == null || strs.length == 0) return new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < strs.length; i++) {
            char[] chars = strs[i].toCharArray();
            Arrays.sort(chars);
            String key = String.valueOf(chars);
            if (!map.containsKey(key)) {
                map.put(key, new ArrayList<>());
            }
            map.get(key).add(strs[i]);
        }
        return new ArrayList<List<String>>(map.values());
        /**
         *  方法2:统计每个字母的个数
         *      如果生成新的字符串相同,说明是字母异位词
         */
        /*
        if (strs == null || strs.length == 0) return new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        char[] chars = new char[26];
        for (String s : strs) {
            Arrays.fill(chars, '0'); // 每次初始化为'0'
            for (char c : s.toCharArray()) {
                chars[c - 'a'] ++;
            }
            String key = String.valueOf(chars); // 新生成的乱码字符串
            if (!map.containsKey(key)) {
                map.put(key, new ArrayList<>());
            }
            map.get(key).add(s);
        }
        return new ArrayList<List<String>>(map.values());
        */
    }
}

 

posted @ 2020-12-11 17:15  不学无墅_NKer  阅读(86)  评论(0编辑  收藏  举报