原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvaszc/
解法一:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length ==0 ) {
return new ArrayList();
}
Map<String,List<String>> map = new HashMap();
for (int i = 0; i < strs.length; i++ ) {
char[] c = strs[i].toCharArray();
Arrays.sort(c);
String key = String.valueOf(c);
if (!map.containsKey(key)) {
map.put(key,new ArrayList<String>());
}
map.get(key).add(strs[i]);
}
return new ArrayList(map.values());
}
}
思路:先排序,后判断,这个题就是一个分组统计的简单实现,问题是怎么分组的问题,题目和我们解释了什么是字母异位词,那么我们要做事就是怎么处理的问题,首先将数组中的字符排序,排序后,如果是字母异位词那么排序后的结果就是一样,然后我们只需要将排序后的值作为key放到map中,value中放统计的值即可。
解法二:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length ==0 ) {
return new ArrayList();
}
Map<String,List<String>> map = new HashMap();
for (int i = 0; i < strs.length; i++ ) {
char[] cTmp = new char[26];
for (char c : strs[i].toCharArray()) {
cTmp[c-'a']++;
}
String key = String.valueOf(cTmp);
if (!map.containsKey(key)) {
map.put(key,new ArrayList<String>());
}
map.get(key).add(strs[i]);
}
return new ArrayList(map.values());
}
}
思路:题目中明确的指出了所有的字母都是小写,我们可以通过将每一个字符映射为一个字符数组的下标,如果是一个异位词的话,那么生成的这个字符数组必然是相等,我们然后通过这个相等的字符数组转换为字符串作为map的key即可。