LeetCode:字母异位词分组

方法一:

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        //遍历所有单词
        for(String s : strs){
            //将字符串打散成字符
            char[] chars = s.toCharArray();
            //对字符排序
            Arrays.sort(chars);
            //重新组装成字符串
            String key = new String(chars);
            //如果map中没有这个key就新建一个ArrayList放进去
            if(!map.containsKey(key)){
                map.put(key,new ArrayList<>());
            }
            //放进key对应的value中去
            map.get(key).add(s);
        }
        //返回所有值
        return new ArrayList<>(map.values());
    }
}

toCharArray():

将字符串拆成单个字符。

Arrays.sort(chars):

将字符数组排序

map.containsKey(key):

有没有key的,返回true或false

map.values():

返回map中所有的值

设有N个单词,每个单词长度为K

时间复杂度:O(N*KlogK)

空间复杂度:O(N*K)

方法二(使用字符出现的频次生成特定的key,更省时间。 ):

java 复制代码
class Solution{
    public List<List<String>> groupAnagrams(String[] strs){
        Map<String,List<String>> map = new HashMap<>();

        //循环读取数组中的每个单词
        for(String s : strs){
            int[] count = new int[26];
            //循环读取每个单词的每个字符
            for(char c : s.toCharArray()){
                //处理单个字符的出现次数
                count[c - 'a']++;
            }
            //拼接字符串
            StringBuilder sb = new StringBuilder();
            for(int i = 0;i < 26;i++){
                if(count[i] > 0){
                    sb.append((char)('a' + i));
                    sb.append(count[i]);
                }
            }
            String key = sb.toString();
            if(!map.containsKey(key)){
                map.put(key,new ArrayList<>());
            }
            map.get(key).add(s);
        }
        return new ArrayList<>(map.values());
    }
}

时间复杂度:O(N*K),没有使用排序

空间复杂度:O(N*K)

拼接字符串使用StringBuilder而不使用String,String为不可变对象,使用String拼接字符串相当于每次添加字符串都申请一个新地址,将原来的字符串抄过来再添加新的字符串,而StringBuilder则在一块连续的地址空间上进行操作,是一个字符数组,默认大小16字符,满的时候向系统申请原来容量的两倍大(通常是两倍+2)的地址空间。

相关推荐
lzhdim9 分钟前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ3 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one5 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David5 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
lll23526917796 小时前
HR如何快速整理面试沟通内容?
面试·职场和发展
零售校长6 小时前
西湖区零售门店店长面试怎么准备
面试·职场和发展·零售
秋天的怀念_David6 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪6 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪6 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn8 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode