49. Group Anagrams(C++和Java解法)

给定字符串数组,将anagrams(颠倒字母而成的单词)分为同一组。

Example:

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

 解题思路:

为了能够辨别anagrams,我们需要将每一个字符串排序,如"eat"->"aet","ate"->"aet",这样就能比较两个顺序不同的字符串了。排序后,我们使用map>,其中key代表排序后的字符串,value代表同一组anagrams,最后value集合就是要求的解。

补充:使用map能够提高算法效率,当将某个字符串排序后,能够直接判断是否已经存在对应的组。刚开始我是用vector,效率低很多。

C++版本

vector> groupAnagrams(vector& strs) {
        vector> result;
        unordered_map> m;
        string temp;

        for(int i = 0;i < strs.size();i++){
            temp = strs[i];
            sort(temp.begin(), temp.end());
            m[temp].push_back(strs[i]);
        }
        for(auto iter = m.begin(); iter != m.end(); iter++)
            result.push_back(iter->second);  
        return result;
}

java版本

public static String strRearrangement(String str){
        char[] array = str.toCharArray();
        Arrays.sort(array);
        return new String(array);
    }
    
    public List> groupAnagrams(String[] strs) {
        List> result = new ArrayList<>();
        Map> map = new HashMap<>();
        String temp = new String();

        for(int i = 0;i < strs.length;i++){
            temp = strRearrangement(strs[i]);
            if (map.containsKey(temp)){
                map.get(temp).add(strs[i]);
            }else {
                List strings = new ArrayList<>();
                strings.add(strs[i]);
                map.put(temp, strings);
            }
        }
        for (String key: map.keySet()){
            result.add(map.get(key));
        }
        return result;
}

本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode  Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。 

你可能感兴趣的:(LeetCode)