给定一个仅包含数字 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
}