一、题目

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

二、思路

字符相同的字符串,字符出现次数是相等的,那么只需要把出现过的字符进行计数,并根据规则“出现字符+出现次数”构建字符串,放置在一个hashmap里面存放即可。

三、代码

  1. class Solution {
  2. public List<List<String>> groupAnagrams(String[] strs) {
  3. Map<String, List<String>> m = new HashMap();
  4. for (String str : strs) {
  5. int[] memo = new int[26]; // 记录每个字符出现次数
  6. for (char c : str.toCharArray()) {
  7. memo[c - 'a']++;
  8. }
  9. StringBuilder keyBuilder = new StringBuilder();
  10. for (int i = 0; i < memo.length; i++) { // 遍历每个字符出现次数,记录下出现次数不为0的字符
  11. if (memo[i] != 0) {
  12. keyBuilder.append((char)(i + 'a')).append(memo[i]);
  13. }
  14. }
  15. String key = keyBuilder.toString();
  16. if (m.get(key) == null) {
  17. m.put(key, new ArrayList<String>());
  18. }
  19. m.get(key).add(str);
  20. }
  21. // 遍历hashmap,构建答案
  22. List<List<String>> ans = new ArrayList<>();
  23. for (Map.Entry<String, List<String>> entry : m.entrySet()) {
  24. ans.add(entry.getValue());
  25. }
  26. return ans;
  27. }
  28. }

时间复杂度为O(strs.length * (26 + 字符平均长度)),空间复杂度为O(strs.length)。
本题还可以使用质数相加的方式构建hashcode,使同样字符数量构建出来的hashcode一致,具体看力扣最优解。