class Solution:
def __init__(self):
self.res = []
self.path = []
def backtrace(self, n, k, start):
if len(self.path) == k:
cur = tuple(self.path)
self.res.append(list(cur))
return
if start + k - len(self.path) <= n + 1: #剪枝
for num in range(start, n+1):
self.path.append(num)
self.backtrace(n, k, num+1)
self.path.pop()
def combine(self, n: int, k: int) -> List[List[int]]:
self.backtrace(n, k, 1)
return self.res
self.path和n是对应的,n为target减去path中所有元素;而start是path和n的下一层,表示紧接着path末尾元素的下一个元素。
class Solution:
def __init__(self):
self.path = []
self.res = []
def backtrace(self, k, n, start):
if len(self.path) == k:
if n == 0:
self.res.append(self.path[:])
return
if start + k - len(self.path) <= 10: #剪枝1
for num in range(start, 10):
if num <= n: #剪枝2
self.path.append(num)
self.backtrace(k, n-num, num+1)
self.path.pop()
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.backtrace(k, n, 1)
return self.res
class Solution:
def __init__(self):
self.path = []
self.res = []
self.num2let = self.getmap()
def getmap(self):
num2let = {}
for i in range(2, 7):
num2let[str(i)] = [chr(ord('a')+j) for j in range(3*(i-2), 3*(i-2)+3)]
num2let['7'] = ['p', 'q', 'r', 's']
num2let['8'] = ['t', 'u', 'v']
num2let['9'] = ['w', 'x', 'y', 'z']
return num2let
def backtrace(self, digits, num_id):
if len(digits) == len(self.path):
self.res.append("".join(self.path))
return
letters = self.num2let[digits[num_id]]
for ind in range(len(letters)):
self.path.append(letters[ind])
self.backtrace(digits, num_id+1)
self.path.pop()
def letterCombinations(self, digits: str) -> List[str]:
if not digits:
return []
self.backtrace(digits, 0)
return self.res