17.电话号码的字母组合

文章目录

题目

'''
Description: 17.电话号码的字母组合
Autor: 365JHWZGo
Date: 2021-12-28 15:54:58
LastEditors: 365JHWZGo
LastEditTime: 2021-12-28 17:31:06
'''

思路

这道题和前面两道组合题的不同在于要遍历的是不同的数组。
区别如下
17.电话号码的字母组合
这样的话我们就需要分析,这两者有什么不同。

左边 右边
每层遍历的数随层数的增加而减少 每层遍历的数保持不变
开始数字为上层的后续数字 开始数字为相应字符串

虽然比较了区别,但是对于其中的实现还是不太清楚,那么我们仔细来分析一下~

  1. 首先每一个数字到了最后一层都要遍历完整个字符串,所以我们知道一定会有对字符串的遍历。
  2. 肯定也有层遍历

在对层遍历的时候,首先都保持每个字符串的首个字符累加
17.电话号码的字母组合
一直递归到最后一层,进行判别和结果追加
17.电话号码的字母组合
之后回溯到上一层,在递归遍历下一个字母
17.电话号码的字母组合
从这里我们可以写出递归代码

for i in range(iF, k):		#iF为开始字符
	 for s in letters[int(digits[i])-1]:
	      temp += s
	      backtracking(digits, temp, i+1)
	      temp = temp[:-1]

在图中相当于从a开始一直向下探深到d,判断加入结果集后,回溯删除d,此时s->letters的下一个字母e,temp+=s = ‘ae’,这样又进入到backtracking中,判断加入结果集,一直到f为止,返回到上一层循环中,此时i指向下一个字符b

代码

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        letters = ["", "abc", "def", "ghi",
                   "jkl", "mno", "pqrs", "tuv", "wxyz"]
        res = []
        k = len(digits)
        if digits == "":
            return []
        def backtracking(digits, temp, iF):
            if len(temp) == k:
                res.append(temp)
                return

            for i in range(iF, k):
                for s in letters[int(digits[i])-1]:
                    temp += s
                    backtracking(digits, temp, i+1)
                    temp = temp[:-1]
                temp = temp[:-1]
        backtracking(digits, "", 0)
        return res

运行结果

17.电话号码的字母组合

代码2

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        letters = ["", "abc", "def", "ghi",
                   "jkl", "mno", "pqrs", "tuv", "wxyz"]
        res = []
        k = len(digits)
        if digits == "":
            return []

        def backtracking(digits, temp, iF):
            if len(temp) == k:
                res.append(temp)
                return
                
			#用变量i可以替代一层for循环
            i = int(digits[iF])-1
            for s in letters[i]:
                temp += s
                backtracking(digits, temp, iF+1 % k)
                temp = temp[:-1]

        backtracking(digits, "", 0)
        return res

运行结果2

17.电话号码的字母组合

总结

这道题不难,需要和之前的题作区分,还有就是要对与每一个位置该干什么要非常清楚,才能很快速地做出,望再接再厉!

上一篇:【LeetCode】22.括号生成


下一篇:回溯算法题解