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());
}
}
分类:
LeetCode Hot100
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理