解法一

采用Map存储变位词数组,关键在于如何对单词字符串进行编码,求得其加入Map时对应的Key值,使得变位单词具有相同的Key值且能够区分非变位单词。
两种主流的编码的方式如下

  • 对单词中的字符进行排序
  • 统计各个字符的出现次数,按照次数进行编码(题中限定仅出现小写字母)
  • (补充)取前26个质数相乘编码

考虑到单词长度一般不会很长,第一种编码方式的表现会更佳。

  1. import java.util.*;
  2. class Solution {
  3. public List<List<String>> groupAnagrams(String[] strs) {
  4. Map<String, List<String>> map = new HashMap<>();
  5. for (String str : strs) {
  6. String key = getKey_1(str);
  7. if (map.containsKey(key)) {
  8. map.get(key).add(str);
  9. } else {
  10. LinkedList list = new LinkedList<>();
  11. list.add(str);
  12. map.put(key, list);
  13. }
  14. }
  15. return new ArrayList<List<String>>(map.values());
  16. }
  17. public String getKey_1(String str) {
  18. char[] chars = str.toCharArray();
  19. Arrays.sort(chars);
  20. return new String(chars);
  21. }
  22. public String getKey_2(String str) {
  23. int[] count = new int[26];
  24. char[] chars = str.toCharArray();
  25. for (char i : chars) {
  26. ++count[i - 97];
  27. }
  28. StringBuilder stringBuilder = new StringBuilder(100);
  29. for (int i = 0; i < count.length; ++i) {
  30. stringBuilder.append(count[i] + "|");
  31. }
  32. return stringBuilder.toString();
  33. }
  34. }