代码随想录算法训练营Day 25| 回溯算法part02 | 216.组合总和III、 17.电话号码的字母组合
文章目录
216.组合总和III
一、未剪枝
class Solution(object):
def combinationSum3(self, k, n):
"""
:type k: int
:type n: int
:rtype: List[List[int]]
"""
result = []
self.backtracking(k,n,[],0,result,1)
return result
def backtracking(self,k,n,path,sum,result,startindex):
if sum == n and len(path)==k:
result.append(path[:])
return
for i in range(startindex,10):
path.append(i)
sum += i
self.backtracking(k,n,path,sum,result,i+1)
path.pop()
sum -= i
二、剪枝
class Solution(object):
def combinationSum3(self, k, n):
"""
:type k: int
:type n: int
:rtype: List[List[int]]
"""
result = []
self.backtracking(k,n,[],0,result,1)
return result
def backtracking(self,k,n,path,sum,result,startindex):
if sum >n: # 剪枝
return
if sum == n and len(path)==k:
result.append(path[:])
return
for i in range(startindex,9-(k-len(path))+2):
path.append(i)
sum += i
self.backtracking(k,n,path,sum,result,i+1)
path.pop()
sum -= i
17.电话号码的字母组合
一、回溯算法
class Solution(object):
def __init__(self):
self.map =['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
self.result = []
self.s = ''
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if not digits:
return []
self.backtracking(digits,0)
return self.result
def backtracking(self,digits,index):
# index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。
# 终止条件是到叶子节点了
if index == len(digits):
self.result.append(self.s)
return
digit = int(digits[index]) # 将索引处的数字转换为整数
letters = self.map[digit] # 获取对应的字符集
for i in range(len(letters)):
self.s += letters[i]
self.backtracking(digits,index+1) # 递归调用,注意索引加1,处理下一个数字
self.s = self.s[:-1]
本题需要注意的地方:
- 本题没有设置startindex,因为每层遍历都是一个新的字符串,因此定义的index表示的是遍历到哪个digit了,即遍历到哪个字符串了
- 什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。所以本题的终止条件是 index == len(digits),即遍历到结果层。
- self.s的回溯是 self.s = self.s[:-1]