leetcode之17电话号码的字母组合Golang
本题主要是用回溯的思想,采用的实现方法是递归
'2': "abc",
'3': "def",
'4': "ghi",
例如数字串234,那么计算他们的组合方式如下
1、获取数字2对应的字符串abc
1.1、读取第一个字符a,将他存入结果elem,此时elem的值就是a
2、获取数字3对应的字符串def
2.1、读取第一个字符d,将他存入结果elem,此时elem的值就是ad
3、获取数字4对应的字符串ghi
3.1、读取第一个字符g,将他存入结果elem,此时elem的值就是adg
3.2、此时到达数字串的最深处,后面没有数字了,将这个elem的值存入结果res
3.3、回溯,将adg变成了ad,然后获取ghi的第二个字符h,将他存入结果elem,此时elem的值就是adh
3.4、重复上述步骤,结果是adi
4、更进一步回溯3对应的字符串
此时将结果字符串由ad变成了a,然后读取def的第二个字符,此时elem的值就是ae,然后再次组合数字4对应的字符
5、以此类推,直到找出所有的结果
代码如下:
func letterCombinations(digits string) []string {
res := make([]string, 0)
numMap := map[byte]string{
'2': "abc",
'3': "def",
'4': "ghi",
'5': "jkl",
'6': "mno",
'7': "pqrs",
'8': "tuv",
'9': "wxyz",
}
length := len(digits)
// recursionFunc := func(deepth int, elem []byte) {
// recursionFunc()
// }
// 在go语言中,在函数内部定义递归函数不能够向上面那样写,因为此时的recursionFunc是一个变量,而不是一个函数,所以不能在变量内部调用变量自己本身
// 变量只有在声明以后才能够使用
// 下面这种形式,recursionFunc已经声明过了,所以可以使用
var recursionFunc func(deepth int, elem []byte)
recursionFunc = func(deepth int, elem []byte) {
// 这个深度指的是数字串的长度,当我们没有到最深处(也就是最后一个数字,那么他们能够组成的字母组合肯定不是完整的,所以继续向下递归)
if deepth < length {
// 用深度获取数字对应的字符
tmpS := numMap[digits[deepth]]
// 遍历完每一个数字对应的字符
for _, value := range tmpS {
// 将当前数字对应的当前字符存入数组
elem = append(elem, byte(value))
// 如果是最后一个数字,说明后面没有数字了,所以将这个字符串写入结果中
if deepth == length-1 {
res = append(res, string(elem))
}
// 记录当前存的字符在字符组合中的位置,因为等下要回溯一位,例如“23”,2-a,3-d,此时就要处理下一位就要回溯,2-a,3-e,回溯的就是d,同理还要用b回溯a,所以需要记录位置
tmpIndex := len(elem) - 1
recursionFunc(deepth+1, elem)
// 将当前数字对应的字符组成的字符组合回溯一位,因为在同一个数字对应的字符中,他么在字符组合中占据的应该是同一个位置
elem = elem[:tmpIndex]
}
}
return
}
elem := make([]byte, 0)
initDeepth := 0
recursionFunc(initDeepth, elem)
return res
}
浙公网安备 33010602011771号