
方法一:
java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
//遍历所有单词
for(String s : strs){
//将字符串打散成字符
char[] chars = s.toCharArray();
//对字符排序
Arrays.sort(chars);
//重新组装成字符串
String key = new String(chars);
//如果map中没有这个key就新建一个ArrayList放进去
if(!map.containsKey(key)){
map.put(key,new ArrayList<>());
}
//放进key对应的value中去
map.get(key).add(s);
}
//返回所有值
return new ArrayList<>(map.values());
}
}
toCharArray():
将字符串拆成单个字符。
Arrays.sort(chars):
将字符数组排序
map.containsKey(key):
有没有key的,返回true或false
map.values():
返回map中所有的值
设有N个单词,每个单词长度为K
时间复杂度:O(N*KlogK)
空间复杂度:O(N*K)
方法二(使用字符出现的频次生成特定的key,更省时间。 ):
java
class Solution{
public List<List<String>> groupAnagrams(String[] strs){
Map<String,List<String>> map = new HashMap<>();
//循环读取数组中的每个单词
for(String s : strs){
int[] count = new int[26];
//循环读取每个单词的每个字符
for(char c : s.toCharArray()){
//处理单个字符的出现次数
count[c - 'a']++;
}
//拼接字符串
StringBuilder sb = new StringBuilder();
for(int i = 0;i < 26;i++){
if(count[i] > 0){
sb.append((char)('a' + i));
sb.append(count[i]);
}
}
String key = sb.toString();
if(!map.containsKey(key)){
map.put(key,new ArrayList<>());
}
map.get(key).add(s);
}
return new ArrayList<>(map.values());
}
}
时间复杂度:O(N*K),没有使用排序
空间复杂度:O(N*K)
拼接字符串使用StringBuilder而不使用String,String为不可变对象,使用String拼接字符串相当于每次添加字符串都申请一个新地址,将原来的字符串抄过来再添加新的字符串,而StringBuilder则在一块连续的地址空间上进行操作,是一个字符数组,默认大小16字符,满的时候向系统申请原来容量的两倍大(通常是两倍+2)的地址空间。