题目一
用[:]将列表固定住
for i in range(startindex,n-(k-len(self.path))+2):为剪枝操作,对长度k的遍历进行剪枝
self.backtracing(n,k,i+1)
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
def combine(self, n, k):
self.backtracing(n,k,1)
return self.res
def backtracing(self,n,k,startindex):
if len(self.path)==k:
self.res.append(self.path[:])
return
for i in range(startindex,n-(k-len(self.path))+2):
self.path.append(i)
self.backtracing(n,k,i+1)
self.path.pop()
第二题
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
self.sum=0
def combinationSum3(self, k, n):
self.backtracing(n,k,1)
return self.res
def backtracing(self,n,k,startindex):
if len(self.path)==k:
if sum(self.path)==n:
self.res.append(self.path[:])
return
#剪枝1
if self.sum>=n:
return
#剪枝2
for i in range(startindex,9-(k-len(self.path))+2):
self.sum+=i
self.path.append(i)
self.backtracing(n,k,i+1)
self.path.pop()
self.sum-=i
第三题
字符串没有-=操作,回溯用s=s[:-1]
class Solution(object):
def __init__(self):
self.letterMap = [
"", # 0
"", # 1
"abc", # 2
"def", # 3
"ghi", # 4
"jkl", # 5
"mno", # 6
"pqrs", # 7
"tuv", # 8
"wxyz" # 9
]
self.res=[]
self.s=''
def letterCombinations(self, digits):
self.getCombinations(digits,0,self.s)
if digits =='':
self.res=[]
return self.res
def getCombinations(self, digits, index, s):
if index+1>len(digits):
self.res.append(s[:])
return
for i in self.letterMap[int(digits[index])]:
s+=i
self.getCombinations(digits,index+1,s)
s=s[:-1]