【回溯算法ii】golang-经典电话号码组合问题

按照9键电话号码输出符合条件的组合

// 9键,数字字符串能够转换的字母组合
func ChangeNumToCombination(digits string) []string {
	// “23”,宽度是“abc”,深度是2
	if len(digits) == 0 {
		return []string {}
	}
	numMap := map[string]string{
		"2": "abc",
		"3": "def",
		"4": "ghi",
		"5": "jkl",
		"6": "mno",
		"7": "pqrs",
		"8": "tuv",
		"9": "wxyz",
	}
	var res []string
	var pre []string
	var in func(n string, s int)
	in = func(num string, startIndex int) {
		n := len(num)
		// 终止条件
		if len(pre) == n {
			tmp := strings.Join(pre, "")
			res = append(res, tmp)
			return
		}
		// 遍历,宽度为n,递归时宽度参数变化为k+1,而不是startIndex+1
		for k := startIndex; k < n; k++ {
			s := numMap[string(num[k])]
			for i := 0; i < len(s); i++ {
				pre = append(pre, string(s[i]))
				in(num, k+1)
				// 回溯
				pre = pre[:len(pre)-1]
			}
		}
	}
	in(digits, 0)
	return res
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值