backtrack——组合问题

面试中遇到的一个问题

// 给定一个仅包含数字 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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值