leetcode49.字母异位词分组

标签:hot100,哈希表

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

示例 1:

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

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

解释:

  • 在 strs 中没有字符串可以通过重新排列来形成 "bat"
  • 字符串 "nat""tan" 是字母异位词,因为它们可以重新排列以形成彼此。
  • 字符串 "ate""eat""tea" 是字母异位词,因为它们可以重新排列以形成彼此。

示例 2:

输入: strs = [""]

输出:[[""]]

示例 3:

输入: strs = ["a"]

输出:[["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

思路:map:key-排序后的字符串,value-字符串列表;时间复杂度O(nklogk);解题完毕后一定要顺便分析下时间复杂度啊,几乎每场面试都会让你分析的......

核心代码:

java 复制代码
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> groupAnagrams = new ArrayList<>();
        Map<String,List<String>> map = new HashMap<>();
        for(int i = 0; i < strs.length; i++){
            char [] temp = strs[i].toCharArray();
            Arrays.sort(temp);
            String sorted_strs = new String(temp);
            List<String> lis = new ArrayList<>();
            if(map.containsKey(sorted_strs)){
                lis = map.get(sorted_strs);
            }
            lis.add(strs[i]);
            map.put(sorted_strs,lis); 
        }
        for(String key : map.keySet()){
            groupAnagrams.add(map.get(key));
        }
        return groupAnagrams;
    }

本地IDE版本:

java 复制代码
public List<List<String>> groupAnagrams(String [] strs){
       Map<String,List<String>> map = new HashMap<>();
       for(int i=0;i<strs.length;i++){
           char[] chars = strs[i].toCharArray();
           Arrays.sort(chars);
           String key = new String(chars);
           List<String> list = new ArrayList<>();
           if(map.containsKey(key)){
               list = map.get(key);
           }
           list.add(strs[i]);
           map.put(key,list);
       }
       List<List<String>> ret = new ArrayList<>();
       for(String key:map.keySet()){
           ret.add(map.get(key));
       }
       return ret;
   }

    public static void main(String[] args) {
        leetcode49 leetcode49 = new leetcode49();
        String [] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> ret = leetcode49.groupAnagrams(strs);
        System.out.println( ret);
    }
相关推荐
Ray Liang1 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解1 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing5 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean5 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven976 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55116 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河16 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程19 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅21 小时前
Java面向对象入门(类与对象,新手秒懂)
java