LeetCode 49 - Group Anagram 归类同构字

原题:

题意简介:给定一个字符串数组,找里面的同构字 (包含相同字母,并且相同的字母个数也相同,比如 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<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<List<String>>();
        if (strs == null || strs.length == 0) return res;
         
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        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<String>());
            map.get(key).add(s);
        }
        return new ArrayList<List<String>>(map.values());
 
    }
}

  

猜你喜欢

转载自www.cnblogs.com/skysmemory/p/10687346.html