LeetCode49 字母异位词分组

题目

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

字母异位词指字母相同,但排列不同的字符串。

 示例 1: 
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 

 示例 2: 
输入: strs = [""]
输出: [[""]]

 示例 3: 
输入: strs = ["a"]
输出: [["a"]] 

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

方法

本题解题思路都是用hashmap为存储,必须用String为key保存

排序法

将字符串的字符排序后判断,字符相同的字符串排序后均相同

  • 时间复杂度:O(knlogn),k为字符串的个数,nlogn是排序的时间
  • 空间复杂度:O(kn),k为字符串的个数,n为字符串的最大长度
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for(String s:strs){
            char[] c = s.toCharArray();
            Arrays.sort(c);
            String key = String.valueOf(c);
            if(!map.containsKey(key)){
                map.put(key,new ArrayList<String>());
            }
            map.get(key).add(s);
        }
        return new ArrayList(map.values());

    }
}

字符数组法

由于总共26个字符,参考桶排序的思想,把字符放入对应的位置,相同字符的字符串在对应后的字符数组一致

  • 时间复杂度:O()
  • 空间复杂度:O()
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for(String s:strs){
            char[] dic = new char[26];
            for(int i=0;i<s.length();i++){
                dic[s.charAt(i)-'a']++;
            }
            String key = String.valueOf(dic);
            if(!map.containsKey(key)){
               map.put(key,new ArrayList<String>());
            }
            map.get(key).add(s);
        }
        return new ArrayList(map.values());
    }
}

计数法

首先把每个字符串的所有字符存入对应数组下标,然后再拼成字符串

  • 时间复杂度:O(n*k),n为字符串的个数,m为最长字符串的长度
  • 空间复杂度:O(n(k+∣Σ∣)),其中 nn 是字符串的数量,k是字符串的最大长度,Σ是字符集即26
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
       Map<String,List<String>> map = new HashMap<>();
       for(String str:strs){
           int[] ch = new int[26];
           for(int i=0;i<str.length();i++){
               ch[str.charAt(i)-'a'] ++;
           }
           StringBuffer strBuf = new StringBuffer();
           for(int i=0;i<26;i++){
               if(ch[i]!=0){
                   strBuf.append('a'+i);
                   strBuf.append(ch[i]);
               }
           }
           String key = strBuf.toString();
           List<String> value = map.getOrDefault(key,new ArrayList<>());
           value.add(str);
           map.put(key,value);
       }
       return new ArrayList<List<String>>(map.values());
    }
}
posted @   你也要来一颗长颈鹿吗  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示