题解一:
排序:对两个字母异位词,二者排序后的字符串完全一样,因此可以对所给字符串进行排序,以排序后的字符串作为HashMap哈希表的键值,将排序前的字符串作为值进行存储分组,最后返回。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> hashMap = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] chars = strs[i].toCharArray();
Arrays.sort(chars);
String key = new String(chars);
List<String> list = hashMap.getOrDefault(key, new ArrayList<>());
list.add(strs[i]);
hashMap.put(key, list);
}
return new ArrayList<List<String>>(hashMap.values());
}
}
题解二:
计数:对两个字母异位词,二者包含的字母和字母数是一样的,因此可以对26个字母进行计数,得出类似“a3b4c5”的字符串作为HashMap哈希表的键值,将多个异位词存储在相同键值下进行分组,最后返回。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> hashMap = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
int[] array = new int[26];
for (int j = 0; j < strs[i].length(); j++) {
array[strs[i].charAt(j) - 'a']++;
}
StringBuilder stringBuilder = new StringBuilder();
for (int k = 0; k < array.length; k++) {
if (array[k] == 0) continue;
stringBuilder.append((char) (k + 'a'));
stringBuilder.append(array[k]);
}
String key = stringBuilder.toString();
List<String> list = hashMap.getOrDefault(key, new ArrayList<>());
list.add(strs[i]);
hashMap.put(key, list);
}
return new ArrayList<List<String>>(hashMap.values());
}
}