题意:
解题思路:
1.每个字符串进行排序(PHP 中先打散为数组,排序后再组装),排序后的字符串作为 key,排序前 的字符串作为值,添加到返回值中即可2.借助 26 个字母与素数的一个映射集。求积可得唯一 key,相当于一个无冲突的 hash function
PHP代码实现:
class Solution { /** * @param String[] $strs * @return String[][] */ function groupAnagrams($strs) { return $this->groupAnagrams1($strs); $map = []; foreach ($strs as $str) { $s = $this->formatStr($str); $map[$s][] = $str; } return $map; } function formatStr($str) { $str = str_split($str); sort($str); return implode("", $str); } function groupAnagrams1($strs) { $resArr = []; // 将 26 个字母映射为 素数,求积可得唯一 key,相当于一个无冲突的 hash function $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]; foreach ($strs as $str) { $strlen = 1; for ($i = 0; $i < strlen($str); $i++) { $strlen *= $prime[ord($str[$i]) - 97]; } $resArr[$strlen][] = $str; } return array_values($resArr); }}
GO代码实现:
func groupAnagrams(strs []string) [][]string { strsMap := make(map[string][]string) for k , v := range strs { //将字符串拆分 vArr := strings.Split(v, "") //排序 sort.Strings(vArr) toStr := strings.Join(vArr,""); //判断是否在map中 if _, ok := strsMap[toStr];!ok { strsMap[toStr] = []string{strs[k]} } else { strsMap[toStr] = append(strsMap[toStr], strs[k]) } } //fmt.Printf("%v",strsMap) strsMapLen := len(strsMap) res := make([][]string, strsMapLen); count := 0; for _, v := range strsMap{ res[count] = v; count++ } return res}