[LeetCode] 49. Group Anagrams

Given an array of strings, group anagrams together.

Example:

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Note:

  • All inputs will be in lowercase.
  • The order of your output does not matter

题目:输入一个字符串数组,将其中所有的变位词(anagram)进行分组,返回这些变位词组构成的集合。假设输入的字符串都是小写,不要求变位词组以及组内变位词的输出顺序。(如果两个字符串s1和s2是属于一组变位词,则s1与s2中的字母出现频率相同(字母位置可能不同),比如eat和tea。)

实现思路:既然要进行变位词分组,想到用Map保存每组变位词,key是这组变位词的一个标志,value是变位词集合。如果字符串s1和s2是一组变位词,由于字母出现频率相同,那么将s1中字母进行升序排列的结果一定等于将s2中字母进行升序排列的结果,因此用排序后的字符串作为每组变位词的key。遍历过程中,先将当前字符串的字符排序,然后检查Map是否含有这个排序结果,如果存在则将当前字符串存进对应的value中,如果不存在则向Map中添加新的键值对(key=这个排序结果,value=当前字符串构成的单元素集合)。整个遍历过程结束后,Map中的value集合就是题目要求的结果。

class Solution {
    public List> groupAnagrams(String[] strs) {
        if (strs == null) throw new IllegalArgumentException("argument is null");
        List> result = new ArrayList<>();
        Map> map = new HashMap<>();
        for (int i = 0; i < strs.length; i++) {
            String key = sortString(strs[i]);
            if (!map.containsKey(key)) {
                List container = new ArrayList<>();
                container.add(strs[i]);
                map.put(key, container);
            }
            else 
                map.get(key).add(strs[i]);
        }
        for (List container : map.values())
            result.add(container);
        return result;
    }
    
    private String sortString(String s) {
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        return new String(chars);
    } 
}

你可能感兴趣的:(LeetCode)