给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。按键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’。示例 1:输入:digits = “23”,输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]。示例 2:输入:digits = “”,输出:[]。示例 3:输入:digits = “2”,输出:[“a”,“b”,“c”]。
自然智慧。递归。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
digits := "23"
ret := letterCombinations(digits)
fmt.Println(ret)
}
var phone = [][]byte{
{'a', 'b', 'c'}, // 2 0
{'d', 'e', 'f'}, // 3 1
{'g', 'h', 'i'}, // 4 2
{'j', 'k', 'l'}, // 5 3
{'m', 'n', 'o'}, // 6
{'p', 'q', 'r', 's'}, // 7
{'t', 'u', 'v'}, // 8
{'w', 'x', 'y', 'z'}, // 9
}
// "23"
func letterCombinations(digits string) []string {
ans := make([]string, 0)
if len(digits) == 0 {
return ans
}
str := []byte(digits)
path := make([]byte, len(str))
process(str, 0, &path, &ans)
return ans
}
func process(str []byte, index int, path *[]byte, ans *[]string) {
if index == len(str) {
*ans = append(*ans, string(*path))
} else {
cands := phone[str[index]-'2']
for _, cur := range cands {
(*path)[index] = cur
process(str, index+1, path, ans)
}
}
}
执行结果如下: