程序媛詹妮弗
终身学习

 

Given an array of strings, group anagrams together.

Example:

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

 

题意:

给定一堆单词,把变位词放一块儿去。

 

碎碎念:

开始想说“eat” 转charArray {'e', 'a', 't'}

“tea” 转charArray {'t', 'e', 'a'}

这样,我就错误的蜜汁以为以上charArray是相等的!

于是用一个Map<char[],  List<Integer>> map 来边扫input 边更新map。 

为何要用List<Integer> ? 我蜜汁绕弯的想将index存下,最后再取出index对应的input string。 (自己都翻白眼啊!)

 

正确且高效的改进是,

sort “eat” 转charArray {'e', 'a', 't'}  为字典排序 {'a', 'e', 't'} 

sort “tea” 转charArray {'t', 'e', 'a'}  为字典排序 {'a', 'e', 't'} 

   

Map<String,  List<String>> map 来存 <变位词sort后的同一结果,  各种可能的变位词>

 

Solution1:  HashMap

(1) convert each string to charArray, sort such charArray to make sure anagrams has uniform reference

(2) hashmap 

(3) get all map.values()

 

code

/*
Time: O(n).  We traverse the input array
Space: O(n). We allocate a hashmap 
*/
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> result = new ArrayList<>();
        // corner case
        if(strs ==null) return result;
        
        Map<String,List<String>> map = new HashMap<>();   
        
        for(int i = 0; i< strs.length; i++){
            char [] curr = strs[i].toCharArray();
            Arrays.sort(curr);  // to make sure anagrams has uniform reference
            String key = String.valueOf(curr); 
            if(!map.containsKey(key)){
                map.put(key,new ArrayList<String> ());
            }
            map.get(key).add(strs[i]);    
        }
        for(List<String> list : map.values()){        //   可以直接简写成
            result.add(new ArrayList<>(list));       //        ||
        }                                           //         \/
        return result;                             //    return new ArrayList<>(map.values);
    }
}

 

posted on 2019-04-14 23:33  程序媛詹妮弗  阅读(155)  评论(0编辑  收藏  举报