题解一:
排序:对两个字母异位词,二者排序后的字符串完全一样,因此可以对所给字符串进行排序,以排序后的字符串作为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());}
}