题目描述
给定一个仅包含数字 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']
的一个数字。
代码及注释
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
}