题目描述
给定一个仅包含数字 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 <= 4digits[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
}