电话号码的字母组合

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
开始想到的是暴力,一层一层遍历,但是由于不知道数字字符串的长度,导致for循环遍历的层数不知道。
回溯算法:
在这里插入图片描述
我们使用深度优先搜索,进行字符串的组合。
我们首先取一个数字,得到映射到的字符串,然后遍历这个字符串,将每个字符进行递归到下一层中,然后还要记录递归的层数,因为递归一层,就是数字字符串的指针+1,当递归层数和数字字符串长度相等时,就要退出循环,还要将记录的字符串放入切片中
代码:

//数字与字母的映射
var letterMap = []string{
    "" ,
    "" ,
    "abc" ,
    "def" ,
    "ghi" ,
    "jkl" ,
    "mno" ,
    "pqrs" ,
    "tuv" ,
    "wxyz" ,
}
var res = make([]string , 0)
//如果字符串为空,则直接返回空切片
func letterCombinations(digits string) []string {
    if digits == ""{
        return res
    }
    res = []string{}
    findcombination(&digits , 0 , "")
    return res
}
//递归
func findcombination(digits *string , index int , s string){
	//如果数字字符串的长度和递归层数相同,则结束,并将字符串放入切片。
     if index == len(*digits) {
         res = append(res , s)
         return
     }
     //得到数字对应的字符串
     letter := letterMap[(*digits)[index] - '0']
     //遍历字符串,并进行递归调用,将遍历的字符串,和之前的字符串进行组合。
     for i := 0 ; i < len(letter) ; i ++ {
         findcombination(digits , index + 1 , s + string(letter[i]))
     }
     return
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值