力扣 - Hot100 (字母异位词分组 - Hash)

49. 字母异位词分组

中等

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
  • 1 <= strs.length <= 104

  • 0 <= strs[i].length <= 100

  • strs[i] 仅包含小写字母

思路详解

有没有这样一种数据结构可以维护n个不同的组,并且能检测每个想加入的成员的唯一性标识来决定给你分配到哪个组 (不然每个元素都可以加入任意组那我分组的意义在哪 ? OVO)。有的兄弟有的。HashMap登场(PoP)

那么决定加入哪个组的关键什么? 这不巧了吗,且看题目【字母异位词 是由重新排列源单词的所有字母得到的一个新单词。】题目要求按异位词来分组,也就是只要组成单词的字母完全相同,就可以被称为一个组,他们就应该有同样的唯一性标识可以进入同一个组,也就是要有同样的key。而题目中的成员是String类型,这就很容易了,让每个String排个序,同一组的异位词不就可以等到同样的结果吗。

代码如下

class Solution {
    public List> groupAnagrams(String[] strs) {
        // 最大单词数量
        int len = strs.length;
        // 维护n个组,每个组互为字母异位词
        HashMap> map = new HashMap<>();
        for(int i = 0; i < len; i ++){
            //取出每个字符串
            String s = strs[i];
            // 转化为字符数组后进行排序
            char[] charArray = s.toCharArray();
            Arrays.sort(charArray);
            // 将排序后的字符串作为唯一key
            String key = new String(charArray);
            // 尝试加入某个组
            List list = map.get(key);
            // 加入失败,您加入的组不存在
            if(list == null){
                List list02 = new ArrayList<>();
                list02.add(s);
                map.put(key, list02);
                // 加入成功
            }else {
                list.add(s);
                // 更新组, 这里如果有重复的value会被覆盖(如: 上一次有两个为一组加入进来了, 本次就是三个为一组覆盖前面的)
                map.put(key, list);
            }
        }
        return new ArrayList>(map.values());
    }
}

你可能感兴趣的:(LeetCode,-,Hot100,leetcode,算法,hash)