算法:字母异位词分组
题目:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
核心解题思想:
把每个字符串都排序,排序后的字符串作为键。检查当前遍历的字符串是不是键,不是键的话说明还没有这个列表,则创建新键和列表;创建列表之后,才能把当前字符串加入到列表!!(要遵循这个顺序)
时间复杂度:O(n⋅klogk),其中 n 是字符串数组的长度,k 是字符串的最大长度。排序每个字符串的时间复杂度是 O(klogk)。
空间复杂度:O(n⋅k),用于存储排序后的字符串和分组的异位词。
梳理步骤:
1. 排序字符数组:
将每个字符串 s 转换为字符数组 c,然后对 c 进行排序。
排序后的字符数组转换为字符串 key,作为哈希表的键。
2. 检查键是否存在:
如果键 key 不存在于 map 中,创建一个新的 ArrayList 并将其放入 map 中。
如果键 key 已经存在,直接获取对应的列表并添加当前字符串 s。
3. 返回结果:
最终返回 map.values() 的一个新列表,其中包含所有分组的异位词列表。
我的代码:
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //新建哈希表存储键值对,键是排序后的字符串,值是字符串列表arraylist
        Map<String,List<String>> map = new HashMap<>();
        
        // 遍历传入的字符串数组
        for(String s : strs){            
             //把传入的字符串转换为字符数组char[],再调用array的排序方法把字符数组升序排序
             char[] chars = s.toCharArray();
             Arrays.sort(chars);
             //把排序后的字符数组重新转换为字符串作为键。用char[]转为字符串最简便。
             String key = new String(chars);
             
             // 到哈希表的键中查找,如果不存在,建立新键,值为空列表
             if(!map.containsKey(key)){
                map.put(key,new ArrayList<>());
             }
             // 把字符串添加到该键的值里面!!注意要先初始化列表,所以添加操作在最后
             map.get(key).add(s); 
        }
    
        // 新建arraylist,存储哈希表的所有值,返回
        return new ArrayList<>(map.values());
    }
    public static void main(String[] args){
        Solution solution = new Solution();
        String[] strs =  {"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> result = solution.groupAnagrams(strs);
        System.out.println(result);
    }
}
    所有正文内容皆为本人原创,禁止搬运
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号