[虚拟机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(变位词组)