17.电话号码组合

94 阅读1分钟

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

 

示例 1:

输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入: digits = ""
输出: []

示例 3:

输入: digits = "2"
输出: ["a","b","c"]

 

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

题解

使用深度遍历的思想,处理所有可能的结果;

和一般 dfs 解法不同的是,这里需要额外多处理一层可能性,因为每一个数字号码又对应了多种可能性,所以我们使用 map 暂存数字和号码的映射关系,在 dfs 单层调用处理时将映射关系展开处理即可。

代码

func letterCombinations(digits string) []string {
    var n int   
    var ans []string
    var tmp []byte
    var m map[int]string
    n = len(digits)
    tmp = make([]byte, 0, n)
    m = map[int]string{2: "abc", 3: "def", 4: "ghi", 5: "jkl", 6: "mno", 7: "pqrs", 8: "tuv", 9: "wxyz"}
    var helper func(start int)
    helper = func(start int) {
        if len(tmp) == n && n != 0 {
            ans = append(ans, string(tmp))
            return
        }

        for i := start; i < n; i++ {
            numbers := m[int(digits[i]-'0')]
            for j := 0; j < len(numbers); j++ {
                tmp = append(tmp, numbers[j])
                helper(i+1)
                tmp = tmp[:len(tmp)-1]
            }
        }
    }
    helper(0)
    return ans
}

图示

image.png