力扣第四十九题-字母异位词分组

422 阅读2分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

前言

力扣第四十九题 字母异位词分组 如下所示:

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

一、思路

力扣第四十九题-字母异位词分组中有一个比较重要的信息:

  • ** 字母异位词 就是相同字符排列成的不同字符串**,如 abcbac 就是 字母异位词

对于 abcbac 来说,如何通过一次遍历就能正确的找到这两个 字母异位词 呢?

  1. 字符串中的字符排序,使得 字母异位词key相同
  2. 哈希表 中存储排序后的 key,从而使 字母异位词 可以正确的分组

综上所述,我们的整体思路为:排序 + 哈希表

举个例子

此处以 strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 作为例子

  1. i=0 时,strs[0] = "eat" 排序后的 key = "aet"。此时 map 中不含此 key,故将 "eat" 放入新建的 List
  2. i=1 时,strs[1] = "tea" 排序后的 key = "aet"。此时 map 中含有此 key,将 "tea" 放入该 key 对应的 List
  3. i=2 时,strs[2] = "tan" 排序后的 key = "ant"。此时 map 中不含此 key,故将 "tan" 放入新建的 List
  4. i=3 时,strs[3] = "ate" 排序后的 key = "aet"。此时 map 中含有此 key,将 "ate" 放入该 key 对应的 List
  5. i=4 时,strs[4] = "nat" 排序后的 key = "ant"。此时 map 中含有此 key,将 "nat" 放入该 key 对应的 List
  6. i=5 时,strs[5] = "bat" 排序后的 key = "abt"。此时 map 中不含此 key,故将 "bat" 放入新建的 List
  7. 最终可以获得正确的 字母异位词 分组

二、实现

实现代码

实现代码与思路中保持一致

    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] array = str.toCharArray();
            Arrays.sort(array); // 排序
            String key = new String(array);
            List<String> list;
            if (map.containsKey(key)) { // 判断key是否存在
                list = map.get(key);
            } else {
                list = new ArrayList<>();
            }
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<>(map.values());
    }

测试代码

    public static void main(String[] args) {
        String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
        new Number49().groupAnagrams(strs);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥