一、题目分析
和前面的两个题一样,这道题也采用hashmap来做
有两种实现的方法,一个是,对数组的每一个字符串元素排序,排序后结果一样的分为一组,也就是说key是排序后的字符串,比如"aet"
第二种方法是统计每个字符串中的每个字符出现的个数,分为同一组的字符串每个字符出现的次数是相同的,也就是key应该记录26个字母(小写)每一个字母出现的个数
二、java代码
第一种方法:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) {
return Collections.emptyList();
}
Map<String, List<String>> ans = new HashMap<>();
for (String str : strs) {
char[] chars = str.toCharArray();//字符串拆分为字符
Arrays.sort(chars);//排序
String key = String.valueOf(chars);//排序后再合并为字符串
if (!ans.containsKey(key)) {
ans.put(key, new ArrayList<String>());
}
ans.get(key).add(str);
}
return new ArrayList(ans.values());
}
}
第二种方法:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) {
return Collections.emptyList();
}
Map<String, List> ans = new HashMap<String, List>();
int[] count = new int[26];//统计26个字符出现的个数
for (String s : strs) {
Arrays.fill(count, 0);
for (char c : s.toCharArray()) {
count[c - 'a']++;//数组中字符本来就是用ASCII码值存储的
}
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < 26; i++) {
sb.append('#');//用特殊符号隔开是怕出现超过9的个数,便于区分
sb.append(count[i]);
}
String key = sb.toString();
if (!ans.containsKey(key)) {
ans.put(key, new ArrayList());
}
ans.get(key).add(s);
}
return new ArrayList(ans.values());
}
}
一个小小的知识点:
就是字符怎么转换为ASCII码值
数组中字符的存储本来就是按照ASCII码值存储的,所以计算字符下标的时候,需要减去字符a的ASCII码值,因为我们是设置的长度为26的数组
'a'就可以表示字符a的ASCII码值