我在想提示词有哈希,可是异位词的hash key也没有共同点啊。但是可以转化后找到共同点,①排序之后的那个字符串作为key ②key是一个26位数组,在Go语言中虽然数组(非切片)是值类型,但固定长度的数组可以作为键。那么value又怎么组织呢?我们把value设置为一个字符串切片就好了。难点应该在这里的map使用相比于常见的情况要稍微多做一步转换。
go语法方面,需要补一下怎排序字符串:
func sortString(s string) string {
runes := []rune(s) // 将字符串转为rune切片(支持Unicode字符)
sort.Slice(runes, func(i, j int) bool {
return runes[i] < runes[j]
})
return string(runes)
}
用排序解题:
func sortString(s string) string {
runes := []rune(s) // 将字符串转为rune切片(支持Unicode字符)
sort.Slice(runes, func(i, j int) bool {
return runes[i] < runes[j]
})
return string(runes)
}
func groupAnagrams(strs []string) [][]string {
m := make(map[string][]string)
for i:=0; i<len(strs); i++ {
sorted := sortString(strs[i])
m[sorted] = append(m[sorted], strs[i])
}
// 将map结果转化为切片
var res [][]string
for _, v := range m {
res = append(res, v)
}
return res
}
然后用数组解题:
func groupAnagrams(strs []string) [][]string {
m := make(map[[26]int][]string)
for i:=0; i<len(strs); i++ {
var arr [26]int // 26的数组而不是make一个26的切片
for _, c := range strs[i] {
arr[c-'a']++ // 不要用=1而是++计数才能区分
}
// for j:=0; j<len(strs[i]); j++ {
// arr[strs[i][j]-'a']++
// } // 一样的
m[arr] = append(m[arr], strs[i])
}
// 将map结果转化为切片
var res [][]string
for _, v := range m {
res = append(res, v)
}
return res
}