2道题目
216. 组合总和 III
17. 电话号码的字母组合
解题理解
216
跟77题基本一致,只是在中间加上n == sum的判断就好
class Solution:
def backtracking(self, k, n, path, res, start, sum):
if sum > n:
return
if(len(path) == k):
if sum == n:
res.append(path[:])
return
for i in range(start, 10 - (k - len(path)) + 1):
sum += i
path.append(i)
self.backtracking(k, n, path, res, i + 1, sum)
sum -= i
path.pop()
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
path = []
res = []
sum = 0
self.backtracking(k, n, path, res, 1, sum)
return res
17
这题像是前面两道回溯的套壳题,就是在回溯外面加了一层字典,而这个字典也需要回溯,所以实现的时候在索引越界和访问字典那里折腾了好久,不过忘记可以用数组代替字典了,用数组应该会更快
class Solution:
def __init__(self):
self.lettermap = {
0: '',
1: '',
2: 'abc',
3: 'def',
4: 'ghi',
5: 'jkl',
6: 'mno',
7: 'pqrs',
8: 'tuv',
9: 'wxyz'
}
self.path = ''
self.res = []
def backtracking(self, digits, start):
if len(digits) == start:
self.res.append(self.path)
return
index = int(digits[start])
letters = self.lettermap[index]
for i in range(len(letters)):
self.path += letters[i]
self.backtracking(digits, start + 1)
self.path = self.path[:-1]
def letterCombinations(self, digits: str) -> List[str]:
if len(digits) == 0:
return self.res
self.backtracking(digits, 0)
return self.res