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
}

  

posted @ 2020-09-09 14:00  胖胖咩  阅读(238)  评论(0)    收藏  举报