题意:

image.png

解题思路:

  1. 1.每个字符串进行排序(PHP 中先打散为数组,排序后再组装),排序后的字符串作为 key,排序前
  2. 的字符串作为值,添加到返回值中即可
  3. 2.借助 26 个字母与素数的一个映射集。求积可得唯一 key,相当于一个无冲突的 hash function

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param String[] $strs
  4. * @return String[][]
  5. */
  6. function groupAnagrams($strs) {
  7. return $this->groupAnagrams1($strs);
  8. $map = [];
  9. foreach ($strs as $str) {
  10. $s = $this->formatStr($str);
  11. $map[$s][] = $str;
  12. }
  13. return $map;
  14. }
  15. function formatStr($str) {
  16. $str = str_split($str);
  17. sort($str);
  18. return implode("", $str);
  19. }
  20. function groupAnagrams1($strs) {
  21. $resArr = [];
  22. // 将 26 个字母映射为 素数,求积可得唯一 key,相当于一个无冲突的 hash function
  23. $prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103];
  24. foreach ($strs as $str) {
  25. $strlen = 1;
  26. for ($i = 0; $i < strlen($str); $i++) {
  27. $strlen *= $prime[ord($str[$i]) - 97];
  28. }
  29. $resArr[$strlen][] = $str;
  30. }
  31. return array_values($resArr);
  32. }
  33. }

GO代码实现:

  1. func groupAnagrams(strs []string) [][]string {
  2. strsMap := make(map[string][]string)
  3. for k , v := range strs {
  4. //将字符串拆分
  5. vArr := strings.Split(v, "")
  6. //排序
  7. sort.Strings(vArr)
  8. toStr := strings.Join(vArr,"");
  9. //判断是否在map中
  10. if _, ok := strsMap[toStr];!ok {
  11. strsMap[toStr] = []string{strs[k]}
  12. } else {
  13. strsMap[toStr] = append(strsMap[toStr], strs[k])
  14. }
  15. }
  16. //fmt.Printf("%v",strsMap)
  17. strsMapLen := len(strsMap)
  18. res := make([][]string, strsMapLen);
  19. count := 0;
  20. for _, v := range strsMap{
  21. res[count] = v;
  22. count++
  23. }
  24. return res
  25. }