题目
Given an array of strings, group anagrams together.
For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Return:
[
[“ate”, “eat”,”tea”],
[“nat”,”tan”],
[“bat”]
]
Note: All inputs will be in lower-case.
思路
这个题需要将包含相同字母但是顺序不同的字符串放到一组,将两个字符串的字符分别进行排序,得到的字符串是相同,说明着两个字符串是同一组的,否则就是不同组。这种可分组且可以有同一标志的数据想到用HashMap存储,但不同键有不同的值怎么保存?让HashMap的值为List就行了。
PS:我自己写了一个for循环判断暴力查找,但是超时了,HashMap使用的是哈希表,查找速度较快。
代码
public static List<List<String>> groupAnagrams1(String[] strs) {
if(strs == null || strs.length == 0) return null;
Map<String,List<String>> map = new HashMap<String,List<String>>();
for(String s : strs){
//将字符串排序后作为HashMap的键
char ch[] = s.toCharArray();
Arrays.sort(ch);
String key = String.valueOf(ch);
if(map.get(key) == null){
map.put(key, new ArrayList<String>());
}
map.get(key).add(s);
}
//
Set<String> s = map.keySet();
List<List<String>> lists = new ArrayList<List<String>>();
for(String t : s){
List<String> list = map.get(t);
lists.add(list);
}
//return new ArrayList<List<String>>(map.values());
return lists;
笔记
1、对字符串按照字符排序可以先将字符串转为字符数组(sting.toCharArray),然后用Arrays.sort()进行排序就行了。
2、将Map中类型键值类型为List的值转移到List
Set<String> s = map.keySet();
List<List<String>> lists = new ArrayList<List<String>>();
for(String t : s){
List<String> list = map.get(t);
lists.add(list);
}
也可用如下更加简洁的方式:
new ArrayList<List<String>>(map.values());