题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
image.png
示例 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'] 的一个数字。

    方案一(回溯)

    ```go var m map[string][]string = map[string][]string { “2”: []string{“a”, “b”, “c”}, “3”: []string{“d”, “e”, “f”}, “4”: []string{“g”, “h”, “i”}, “5”: []string{“j”, “k”, “l”}, “6”: []string{“m”, “n”, “o”}, “7”: []string{“p”, “q”, “r”, “s”}, “8”: []string{“t”, “u”, “v”}, “9”: []string{“w”, “x”, “y”, “z”}, }

func letterCombinations(digits string) []string { if digits == “” { return []string{} }

  1. var res []string
  2. dfs(digits, "", &res)
  3. return res

}

func dfs(digits string, path string, res []string) { if digits == “” { res = append(*res, path) return }

for _, alpha := range m[string(digits[0])] {
    dfs(digits[1:], path + alpha, res)
}

}

<a name="BkLqm"></a>
# 方案二(递归)
```python
class Solution:
    def __init__(self):
        self.map = {
            "2": ["a", "b", "c"],
            "3": ["d", "e", "f"],
            "4": ["g", "h", "i"],
            "5": ["j", "k", "l"],
            "6": ["m", "n", "o"],
            "7": ["p", "q", "r", "s"],
            "8": ["t", "u", "v"],
            "9": ["w", "x", "y", "z"]
        }

    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return []
        if len(digits) == 1:
            return self.map[digits]

        # 前 i 个 digits 组成的 ret
        res = self.letterCombinations(digits[:-1])

        ret = []
        for each in res:
            for word in self.map[digits[-1]]:
                ret.append(each + word)

        return ret

原文

https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/