一、题目
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
二、思路
字符相同的字符串,字符出现次数是相等的,那么只需要把出现过的字符进行计数,并根据规则“出现字符+出现次数”构建字符串,放置在一个hashmap里面存放即可。
三、代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> m = new HashMap();
for (String str : strs) {
int[] memo = new int[26]; // 记录每个字符出现次数
for (char c : str.toCharArray()) {
memo[c - 'a']++;
}
StringBuilder keyBuilder = new StringBuilder();
for (int i = 0; i < memo.length; i++) { // 遍历每个字符出现次数,记录下出现次数不为0的字符
if (memo[i] != 0) {
keyBuilder.append((char)(i + 'a')).append(memo[i]);
}
}
String key = keyBuilder.toString();
if (m.get(key) == null) {
m.put(key, new ArrayList<String>());
}
m.get(key).add(str);
}
// 遍历hashmap,构建答案
List<List<String>> ans = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : m.entrySet()) {
ans.add(entry.getValue());
}
return ans;
}
}
时间复杂度为O(strs.length * (26 + 字符平均长度)),空间复杂度为O(strs.length)。
本题还可以使用质数相加的方式构建hashcode,使同样字符数量构建出来的hashcode一致,具体看力扣最优解。