原题:
题意简介:给定一个字符串数组,找里面的同构字 (包含相同字母,并且相同的字母个数也相同,比如 abc 和 cab, cba,acb,bac,bca 互为同构字,但是abc 和 aabc 就不是同构字)。归类好同构字之后,就把护卫同构字的单词以 List 的形式输出出来,所以我们的result 应该是 List<List<String>>。
解题思路:
1. 根据同构字的特性,针对互为同构字的每一个单词进行排序之后,这些单词就会变成同一个单词。例如 cab, cba, bca, bac, acb,每一个单词排序之后,都会变成 abc。
2. 所以根据这个特性,我们可以把输入的字符串数组的每一个单词进行排序,排序后结构相同的单词就归类在一起,通过这种方式完成归类。
3. 通过 步骤1 和步骤2 的分析,我们自然想到了使用HashMap 作为归类存储的数据结构,key:同构字排序后的结果,value:结构相同的单词,以List的方式存储。
4. 所以,整个过程应该是:对输入数组的每个单词进行排序,排序好之后,去HashMap 内查找是否已经有这个同构字存在,如果有,就把这个单词放入其对应的key 所 map 到的value List 里面;如果没有这个同构字,则把排好序的单词作为key 放入HashMap 中。如此进行循环,直到遍历完整个输入数组。最后,我们将Map 中的 value 全部输出,即为结果。
AC 代码
class Solution { public List
> groupAnagrams(String[] strs) { List
> res = new ArrayList
>(); if (strs == null || strs.length == 0) return res; Map > map = new HashMap >(); for (String s : strs) { char[] c = s.toCharArray(); Arrays.sort(c); String key = String.valueOf(c); if (!map.containsKey(key)) map.put(key, new ArrayList ()); map.get(key).add(s); } return new ArrayList
>(map.values()); }}