题目
给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如: "abc" -> "bcd"
。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列:
"abc" -> "bcd" -> ... -> "xyz"
给定一个包含仅小写字母字符串的列表,将该列表中所有满足 “移位” 操作规律的组合进行分组并返回。
示例:
输入: ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"]
输出:
[
["abc","bcd","xyz"],
["az","ba"],
["acef"],
["a","z"]
]
方案一
func groupStrings(strings []string) [][]string {
m := map[string][]string{}
for _, str := range strings {
mode := GetMode(str)
if _, ok := m[mode]; !ok {
m[mode] = []string{}
}
m[mode] = append(m[mode], str)
}
ret := [][]string{}
for _, v := range m {
ret = append(ret, v)
}
return ret
}
// 获取移位字符串
// "abc" -> "bcd" -> ... -> "xyz" // 输入前面的值全都得到 "abc"
// "az" -> "ba" // 映射到 "az"
func GetMode(str string) string {
gap := rune(str[0]) - 97
ret := []string{}
for _, anscii := range str {
code := anscii - gap
if code < 97 {
code += 26
}
ret = append(ret, string(code))
}
return strings.Join(ret, "")
}
- 该题主要难点是如何设计
key
即mode
原文
https://leetcode-cn.com/explore/learn/card/hash-table/206/practical-application-design-the-key/821/