面试中遇到的一个问题
// 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
// 给出数字到字母的映射如下
// "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"},
// 输入:digits = "23"
// 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
// 输入:digits = ""
// 输出:[]
// 输入:digits = "2"
// 输出:["a","b","c"]
// 0 <= digits.length <= 4
// digits[i] 是范围 ['2', '9'] 的一个数字。
leetcode上有个类似的题
https://leetcode.com/problems/permutations/
但是这个题目,要更难点。
直接贴答案了
var mp = map[uint8][]string{
'2': []string{"a", "b", "c"},
'3': []string{"d", "e", "f"},
'4': []string{"g", "h", "i"},
'5': []string{"j", "k", "l"},
'6': []string{"m", "n", "o"},
'7': []string{"p", "q", "r", "s"},
'8': []string{"t", "u", "v"},
'9': []string{"w", "x", "y", "z"},
}
func getSet(digits string) []string {
var res [][]string
var tmp []string
res = backtrack(res, tmp, digits, 0)
xx := make([]string, len(res))
for i := 0; i < len(res); i++ {
xx[i] = strings.Join(res[i], "")
}
return xx
}
func backtrack(res [][]string, tmp []string, digits string, start int) [][]string {
if len(tmp) == len(digits) {
res = append(res, constructString(tmp))
return res
}
nodes := mp[digits[start]]
for i := 0; i < len(nodes); i++ {
tmp = append(tmp, nodes[i])
res = backtrack(res, tmp, digits, start+1)
tmp = tmp[0 : len(tmp)-1]
}
return res
}
func constructString(list []string) []string {
res := make([]string, len(list))
for i := 0; i < len(list); i++ {
res[i] = list[i]
}
return res
}