题意:
解题思路:
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
}