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);
}
}