[虚拟机OA]Group Anagram 变位词归类

Posted liuliu5151

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[虚拟机OA]Group Anagram 变位词归类相关的知识,希望对你有一定的参考价值。

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);
    
技术图片

以上是关于[虚拟机OA]Group Anagram 变位词归类的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode]49. Group Anagrams变位词归类

两个字符串是变位词(简单)

[LeetCode] 49. Group Anagrams 分组变位词

LeetCode每天一题Group Anagrams(变位词组)

LintCode日记——两个字符串是变位词(C++,Python)

[虚拟机OA]Climb the hill 爬山