题目
题解
排序
字母相同,但排列不同的字符串,排序后都一定是相同的,依此建立哈希表。
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))