当前位置:网站首页>【LeetCode】Day111-字母异位词分组
【LeetCode】Day111-字母异位词分组
2022-08-10 04:24:00 【倒过来是圈圈】
题目
题解
排序
字母相同,但排列不同的字符串,排序后都一定是相同的,依此建立哈希表。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>>map=new HashMap<>();
for(String str:strs){
//字符串排序
char[] array=str.toCharArray();
Arrays.sort(array);
String key=new String(array);//排序好的字符串
//加入哈希表
List<String>list=map.getOrDefault(key,new ArrayList<>());
list.add(str);
map.put(key,list);
}
return new ArrayList<>(map.values());
}
}
时间复杂度: O ( n k l o g k ) O(nklogk) O(nklogk),其中 n 是 strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。对于每个字符串,需要 O(klogk) 的时间进行排序以及 O(1) 的时间更新哈希表,因此总时间复杂度是 O(nklogk)。
空间复杂度: O ( n k ) O(nk) O(nk)
计数
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>>map=new HashMap<>();
for(String str:strs){
//计数
int[] count=new int[26];
for(int i=0;i<str.length();i++)
count[str.charAt(i)-'a']++;
//构造字符串,字母+字母出现次数(如:a2b3g1),作为主键
StringBuffer sb=new StringBuffer();
for(int i=0;i<26;i++){
if(count[i]!=0){
sb.append('a'+i);
sb.append(count[i]);
}
}
//加入哈希表
String key=sb.toString();
List<String>list=map.getOrDefault(key,new ArrayList<>());
list.add(str);
map.put(key,list);
}
return new ArrayList<>(map.values());
}
}
时间复杂度: O ( n ( k + 26 ) ) O(n(k+26)) O(n(k+26))
空间复杂度: O ( n ( k + 26 ) ) O(n(k+26)) O(n(k+26))
边栏推荐
猜你喜欢
随机推荐
ZZULIOJ:1018: 奇数偶数
Acwing 59. 把数字翻译成字符串 计数类DP
mindspore安装过程中报错cannot find zlib
Flink CDC介绍和个人理解
LeetCode 周赛笔记 —— 2022年8月 第一周
X书6.97版本shield-unidbg调用方式
2022/8/9
2022山东省安全员C证考试题及模拟考试
自定义训练,使用Generator dataset迭代数据报错
阿笑家的黄桃
ZZULIOJ:1016: 银行利率
深入学习Synchronized各种使用方法
什么是遗留代码:有效地处理遗留代码的8个小贴士
PID整定方法
2022年R2移动式压力容器充装考试题库模拟考试平台操作
智能锁控板的主要功能有哪些?如何使用?
7、Chrome浏览器在Citrix虚拟应用会话中没有声音
【网络迁移】Pytorch中的torch.is_tensor对应MindSpore哪个接口
ZZULIOJ:1028: I love 闰年!
JVM类加载机制









