【剑指offer】电话号码的字母组合 [Go语言]

106 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

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

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

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

示例 2:

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

示例 3:

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

AC Code

func letterCombinations(digits string) []string {
    var m = map[byte][]byte{
		'2': {'a', 'b', 'c'},
		'3': {'d', 'e', 'f'},
		'4': {'h', 'i', 'g'},
		'5': {'k', 'l', 'j'},
		'6': {'m', 'n', 'o'},
		'7': {'p', 'q', 'r', 's'},
		'8': {'t', 'u', 'v'},
		'9': {'w', 'x', 'y', 'z'},
	}
(1)    ans := make([]string,0)
    n := len(digits)
    if n==0 {
        return ans
    }
(2)    var dfs func(k int, res []byte)
(3)    dfs = func(k int,res []byte){
        if k == n {
(4)            ans = append(ans,string(res))
            return
        }
        for i:=0; i<len(m[digits[k]]); i++ {
(5)            res = append(res,m[digits[k]][i])
(6)            dfs(k+1,res)
(7)            res = res[:len(res)-1]
        }
    }
(8)    dfs(0,[]byte{})
    return ans
}
  • (1) 开创一个数组来存元素
  • (2) 定义一个函数来进行递归
  • (3) 传入是元素个数和暂存的数组
  • (4) 如果这个传入的元组个数k等于n的话,就表示已经有了一种结果了,所以就可以保存这个答案。
  • (5) digits[k] 就是输入的“23”中的每个元素,然后对这个进行 m[digits[k]] 就知道这是啥了。
  • (6) 然后这个就是一个操作了,不断进行下一步的操作,递归进行
  • (7) 最后要回溯,把最后一个删除,那么这次dfs就结束了
  • (8) 输入函数,初始值是0,然后传入空的byte类型的切片