题目

给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如: "abc" -> "bcd"。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列:

"abc" -> "bcd" -> ... -> "xyz"

给定一个包含仅小写字母字符串的列表,将该列表中所有满足 “移位” 操作规律的组合进行分组并返回。

示例:

  1. 输入: ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"]
  2. 输出:
  3. [
  4. ["abc","bcd","xyz"],
  5. ["az","ba"],
  6. ["acef"],
  7. ["a","z"]
  8. ]

方案一

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, "")
}
  • 该题主要难点是如何设计 keymode

原文

https://leetcode-cn.com/explore/learn/card/hash-table/206/practical-application-design-the-key/821/