一、题目描述
☆☆☆☆二、解法
方法1:先排序,再判断。 “当且仅当它们的排序字符串相等时,两个字符串是字母异位词。”
方法2:按计数分类。 “当且仅当它们的字符计数(每个字符的出现次数)相同时,两个字符串是字母异位词。”
class Solution { public List<List<String>> groupAnagrams(String[] strs) { /** * 方法1:先排序,再判断. 时间复杂度O(NKlogK), 空间复杂度 O(NK) * 思路:维护一个Map,每个键是一个排序字符串,值是字符串列表list * 复杂度分析:N是strs的长度,K是strs中字符串的最大长度。外部循环O(N),内部排序O(KlogK) */ if (strs == null || strs.length == 0) return new ArrayList<>(); Map<String, List<String>> map = new HashMap<>(); for (int i = 0; i < strs.length; i++) { char[] chars = strs[i].toCharArray(); Arrays.sort(chars); String key = String.valueOf(chars); if (!map.containsKey(key)) { map.put(key, new ArrayList<>()); } map.get(key).add(strs[i]); } return new ArrayList<List<String>>(map.values()); /** * 方法2:统计每个字母的个数 * 如果生成新的字符串相同,说明是字母异位词 */ /* if (strs == null || strs.length == 0) return new ArrayList<>(); Map<String, List<String>> map = new HashMap<>(); char[] chars = new char[26]; for (String s : strs) { Arrays.fill(chars, '0'); // 每次初始化为'0' for (char c : s.toCharArray()) { chars[c - 'a'] ++; } String key = String.valueOf(chars); // 新生成的乱码字符串 if (!map.containsKey(key)) { map.put(key, new ArrayList<>()); } map.get(key).add(s); } return new ArrayList<List<String>>(map.values()); */ } }