题目描述
给定一个仅包含数字 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']
的一个数字。
代码及注释
go
func letterCombinations(digits string) []string {
// 定义数字对应的字母映射表
m := []string{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}
// 初始化结果切片和当前路径切片
res, path := make([]string, 0), make([]byte, 0)
// 如果输入的数字字符串为空,则直接返回空结果切片
if digits == "" {
return res
}
// 定义深度优先搜索函数
var dfs func(digits string, pos int)
dfs = func(digits string, pos int) {
// 如果当前位置已经遍历到数字字符串的末尾
if pos == len(digits) {
// 将当前路径切片转换为字符串,并添加到结果切片中
tmp := string(path)
res = append(res, tmp)
return
}
// 获取当前位置对应的数字,并获取其对应的字母字符串
digit := int(digits[pos] - '0')
str := m[digit-2]
// 遍历当前数字对应的字母字符串中的每个字母
for i := 0; i < len(str); i++ {
// 将当前字母添加到路径切片中,并继续深度优先搜索下一个位置的数字
path = append(path, str[i])
dfs(digits, pos+1)
// 回溯,将当前字母从路径切片中移除
path = path[:len(path)-1]
}
}
// 从第一个位置开始进行深度优先搜索
dfs(digits, 0)
// 返回结果切片
return res
}