力扣系列之-49. 字母异位词分组

57 阅读1分钟

题目链接

leetcode.cn/problems/gr…

题解

分析

刚开始没看懂题,看了老大会才看懂,给一个字符串数组,然后把里面的字母异位词放到一个集合里面。字母异位词就是 比如cat 和 tac 这两单词,里面的每个字母的个数都是一样的,但是顺序不一样。其实懂这个概念,这个题就好做了。

可能遇到的问题

  1. 一模一样的单词是异位词吗?题目里没说,但是我感觉应该不算。
  2. 数据量与数据范围大吗?题目的字符串数组数量最大是100个,感觉这里不是瓶颈,主要还是字符的最大长度是10000,这个可能就要考虑优化算法了。

解决

伪代码

  • 构建一个Map,key是字符串,value是所有的字母异位词
  • 遍历字符串数组
  • 把相同key的字母异位词放到一块

所以核心还是如何把所有的字母异位词根据里面的每一个字符统一成一样的key。可以先把字符的字符数组排序,这样无论这个字符的顺序怎么样,排序之后一定是一样的。

代码实现

ublic List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            List<String> list = map.getOrDefault(key, new ArrayList<>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<>(map.values());
    }

总结与回顾