力扣练习之字母异位词分组

我爱海鲸 2023-01-07 23:34:38 暂无标签

简介中级算法、数组和字符串

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvaszc/

解法一:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        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[] c = strs[i].toCharArray();
            Arrays.sort(c);
            String key = String.valueOf(c);

            if (!map.containsKey(key)) {
                map.put(key,new ArrayList<String>());
            }
            map.get(key).add(strs[i]);
        }
        return new ArrayList(map.values());
    }
}

思路:先排序,后判断,这个题就是一个分组统计的简单实现,问题是怎么分组的问题,题目和我们解释了什么是字母异位词,那么我们要做事就是怎么处理的问题,首先将数组中的字符排序,排序后,如果是字母异位词那么排序后的结果就是一样,然后我们只需要将排序后的值作为key放到map中,value中放统计的值即可。

解法二:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        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[] cTmp = new char[26];

            for (char c : strs[i].toCharArray()) {
                cTmp[c-'a']++;
            }

            String key = String.valueOf(cTmp);

            if (!map.containsKey(key)) {
                map.put(key,new ArrayList<String>());
            }
            map.get(key).add(strs[i]);
        }
        return new ArrayList(map.values());
    }
}

思路:题目中明确的指出了所有的字母都是小写,我们可以通过将每一个字符映射为一个字符数组的下标,如果是一个异位词的话,那么生成的这个字符数组必然是相等,我们然后通过这个相等的字符数组转换为字符串作为map的key即可。

你好:我的2025