LeetCode(力扣)热题 (2/100):字母异位词分组

139 阅读2分钟

字母异位词分组

1、题目:

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

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

示例 1:

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

2、解题思路:

2.1理解题目要求

  1. 字母异位词:由相同的字母以不同的顺序构成的词
  2. 找到字母异位词,将其组合在一起,返回结果列表

2.2找到字母异位词

  1. 我们发现字母异位词只要经过排序将会变成一样的词,举例:

    //"eat", "tea", "ate"经过排序都会变成"aet"
    
  2. 将排序后的词当做哈希表中的key值,对应的字母异位词当value值

  3. 那我们就直接将相同的key值所对应的value值归为一类,就完成了分类

2.3整体思路架构

  1. 判断字符串是否为空
  2. 创建哈希表<String,List>
  3. 遍历字符串数组(遍历异位词)
  4. 将遍历到的字符串转化为字符数组(将遍历到的异位词转化为字符数组,方便对字母排序)
  5. 对转化后的字符数组进行排序(相同的异位词排序后变成一样的了)
  6. 将排序好的字符数组作为哈希表的key值
  7. 判断哈希表中是否有相同的key值,有就将该异位词放到key值对应的value中,没有就创建新的键值对
  8. 最后返回哈希表中的value值

3、代码实现

public List<List<String>> groupAnagrams(String[] strs) {
        //判断是否为空字符串数组
        if(strs == null || strs.length == 0){
            return new ArrayList();
        }
        //1.创建一个哈希表
        Map<String,List> map = new HashMap<String, List>();
        for (String s: strs) {
            //将字符串转化为字符数组
            char[] chars = s.toCharArray();
            //对字符数组按照字母顺序排序
            Arrays.sort(chars);
            //将排序后的字符串作为哈希表中的key值
            String key = String.valueOf(chars);
            //2.判读哈希表中是否有该key值
            if (!map.containsKey(key)){
                //若不存在,则为新的异位词语,在map中创建新的键值对
                map.put(key,new ArrayList());
            }
            //3.将该字符串放在对应key的list中