文章目录
题目
'''
Description: 17.电话号码的字母组合
Autor: 365JHWZGo
Date: 2021-12-28 15:54:58
LastEditors: 365JHWZGo
LastEditTime: 2021-12-28 17:31:06
'''
思路
这道题和前面两道组合题的不同在于要遍历的是不同的数组。
区别如下
这样的话我们就需要分析,这两者有什么不同。
左边 | 右边 |
---|---|
每层遍历的数随层数的增加而减少 | 每层遍历的数保持不变 |
开始数字为上层的后续数字 | 开始数字为相应字符串 |
虽然比较了区别,但是对于其中的实现还是不太清楚,那么我们仔细来分析一下~
- 首先每一个数字到了最后一层都要遍历完整个字符串,所以我们知道一定会有对字符串的遍历。
- 肯定也有层遍历
在对层遍历的时候,首先都保持每个字符串的首个字符累加
一直递归到最后一层,进行判别和结果追加
之后回溯到上一层,在递归遍历下一个字母
从这里我们可以写出递归代码
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
运行结果
代码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
总结
这道题不难,需要和之前的题作区分,还有就是要对与每一个位置该干什么要非常清楚,才能很快速地做出,望再接再厉!