問題:數組
Given an array of strings, group anagrams together.spa
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:code
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note:
For the return value, each inner list’s elements must follow the lexicographic order. (字典排序)
All inputs will be in lower-case.排序
解決:element
① 把字符串中的字符排序後,若都相等則爲同一組,使用map對其進行分類。字符串
public class Solution { //47ms
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length == 0)
return new ArrayList<>();
// 此排序是爲了讓每一個List<String>的結果按照字典序輸出
// 可是並不須要,此題沒要求
Arrays.sort(strs);
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
char[] schar = str.toCharArray();
// 將char數組按照字典順序排序
Arrays.sort(schar);
String sortStr = String.valueOf(schar);
// 排序後的String做爲key,
if (!map.containsKey(sortStr))
map.put(sortStr, new ArrayList<>());
map.get(sortStr).add(str);
}
// 注意ArrayList的構造方法的應用
return new ArrayList<>(map.values());
}
}get
② 在discuss中看到,使用hash table對字符進行排序,使用map對字符相同的單詞進行分類。input
public class Solution { //27ms
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for(String str : strs){
char[] arr = new char[26];
for(char c : str.toCharArray()){
arr[c - 'a']++;
}
String key = new String(arr);
List<String> list = map.getOrDefault(key, new ArrayList<>());
list.add(str);
map.put(key, list);
}
res.addAll(map.values());
return res;
}
}string
③ hash
class Solution { // 21ms
public List<List<String>> groupAnagrams(String[] strs) {
int[] prime = {
2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97, 101
}; //26個,用來表示字符
List<List<String>> res = new ArrayList<List<String>>();
HashMap<Integer, List<String>> map = new HashMap<>();
for (String s : strs) {
int key = 1;
for (char c : s.toCharArray()) {
key *= prime[c - 'a']; } if (! map.containsKey(key)) { List<String> tmp = new ArrayList<>(); tmp.add(s); res.add(tmp); map.put(key, tmp); } else { List<String> tmp = map.get(key); tmp.add(s); } } return res; } }