题意:给出若干个字符串,将他们按照组成的字符集合进行分组。
例子:
input:
["eat", "tea", "tan", "ate", "nat", "bat"]
output:
[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]
这道题目的关键之处,其实就是怎么样判断两个字符串拥有相同的“字符集”,这样类型的判断通常有两种方法:
第一种是对任意两个字符串进行比较,判断他们的字符集是否相同。这样的方法适用于字符串数量较小的情况。
第二种方法就是使用HashMap,对字符串进行排序,排序后的string作为key, 把有同样anagrams的string以list的形式放到value里,然后输出。即:
我们不难发现,第二种方法会更适用于这道题目。值得一提的是,第二种做法中求出每个字符串的字符集,实际上就是一种Hash策略(即对一个物体计算一个方便使用的数值来代表这个物体,并且拥有相同特性的物品计算出的数值会一定程度上相同,于是就可以利用这个数值来找到类似的物体),这也就是为什么Hash是这道题的标签之一的原因。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
HashMap<String, List<String>> hm = new HashMap<>();
int len = strs.length;
for(int i = 0; i < len; i++){
char[] ca = strs[i].toCharArray();
Arrays.sort(ca);
String key = String.valueOf(ca);
if(!hm.containsKey(key)) hm.put(key, new ArrayList<String>());
hm.get(key).add(strs[i]);
}
return new ArrayList<List<String>>(hm.values());
}
}