LeetCode热题100: 49.字母异位词分组

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

示例 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] 仅包含小写字母

老规矩,直接上代码,看不懂的请留言或私信我

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> ans = new ArrayList<>();
        if(strs.length == 1) {
            ans.add(new ArrayList<>());
            ans.get(0).add(strs[0]);
            return ans;
        }
        Map<String, List<String>> map = new HashMap<>();
        /**如果大于1个遍历一下,遍历的过程中统计每个字母的词频,然后按照从a到z的顺序拼接,比如a出现两次拼接aa,都拼接完存入map以拼接完的string对应的list*/
        for(String str : strs) {
            char[] sArr = str.toCharArray();
            int[] count = new int[26];
            /**统计字符出现的频次 */
            for(char c : sArr) {
                count[c - 'a'] ++;
            }
            /**统计完之后拼接字符串*/
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < count.length; i++) {
                for(int j = 0; j < count[i]; j ++) {
                    sb.append((char)('a' + i));
                }
            }
            String strCur = sb.toString();
            /**拿到按a~z的顺序排序后对应的list,有就拿原来的,没有就建个新的*/
            List<String> strList = map.getOrDefault(strCur, new ArrayList<>());
            /**把当前单词加入 */
            strList.add(str);
            /**别忘了put,这是针对新建list的情况,如果不put的话map里就不存在 */
            map.put(strCur, strList);
        }
        /**map的values是我们的各个异位词的list */
        for(List<String> list : map.values()) {
            ans.add(list);
        }
        return ans;
    }
}

运行结果不是特别好,但是面试肯定过了,懒得优化了

相关推荐
壹号用户12 小时前
用队列实现栈
数据结构·算法
做人求其滴13 小时前
面试经典 150 题 380 274
c++·算法·面试·职场和发展·力扣
小江的记录本13 小时前
【Java基础】Java 8-21新特性:JDK21 LTS:虚拟线程、模式匹配switch、结构化并发、序列集合(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
daad77713 小时前
记一组无人机IMU传感器数据
算法
计算机安禾13 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
小O的算法实验室13 小时前
2026年KBS,流形感知强化学习差分进化算法+不规则3D无人机路径规划,深度解析+性能实测
算法·智能算法·智能算法改进
玖釉-13 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
不做无法实现的梦~13 小时前
运动控制系统复习一览-----常考题目总结版本
算法
二宝哥13 小时前
离线安装maven
java·数据库·maven
小短腿的代码世界13 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构