转载自:https://leetcode-cn.com/problems/group-anagrams/ 侵删
分析:
本题的难点就是将异位词归位一类,也即是如何判断异位词为同一类异位词,这样就需要寻找某中方法来对词进行计算,使得属于同一类的异位词计算的结果一致。
两种方法:
1.排序哈希
2.字母哈希
import java.util.*;
public class FirstSolution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> resMap = new HashMap<>();
for (String str : strs) {
char[] array = str.toCharArray();
Arrays.sort(array);
String randomStr = new String(array);
List<String> tempList = resMap.getOrDefault(randomStr, new ArrayList<>());
tempList.add(str);
resMap.put(randomStr, tempList);
}
List<List<String>> res = new ArrayList<>();
res.addAll(resMap.values());
return res;
}
public static void main(String[] args) {
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SecondSolution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> resMap = new HashMap<>();
for (String str : strs) {
int[] counts = new int[26];
for (int i = 0; i < str.length(); i++) {
counts[str.charAt(i) - 'a']++;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < counts.length; i++) {
if (counts[i] > 0) {
sb.append((char) ('a' + i));
sb.append(counts[i]);
}
}
List<String> tempList = resMap.getOrDefault(sb.toString(), new ArrayList<>());
tempList.add(str);
resMap.put(sb.toString(), tempList);
}
return new ArrayList<List<String>>(resMap.values());
}
public static void main(String[] args) {
}
}
其实一开始也是我自己想复杂了,想的是如何用高效的方法(如:的算法)来对词语进行归类(归为同一类),后来看了解答,好像解法也都不是我想象中的那么高效,这里其实也有一点收获,不要一开始就想着用非常高效的算法来解答某个问题,这样不利于解题过程,很有可能会卡壳。