39. 组合总和
class Solution:
def __init__(self):
self.res = [] #所有结果
self.path = [] #单个结果
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.backtracking(candidates, target, 0, 0)
return self.res
def backtracking(self, candidates, target, sum, startindex):
if sum > target:
return
if sum == target:
self.res.append(self.path[:])
return
for i in range(startindex, len(candidates)):
self.path.append(candidates[i])
self.backtracking(candidates,target,sum+candidates[i], i) #sum的回溯隐藏在参数里
self.path.pop() #回溯
40.组合总和II
用used标记来消除符合题意的重复
class Solution:
def __init__(self):
self.res = [] #所有结果
self.path = [] #单个结果
self.used = [] #标记元素是否使用
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
self.used = [0] * len(candidates) #使用used标记元素是否使用
candidates.sort() #排序使相同的在一起
self.backtracking(candidates, target, 0, 0)
return self.res
def backtracking(self, candidates, target, sum, startindex):
if sum > target:
return
if sum == target:
self.res.append(self.path[:])
return
for i in range(startindex, len(candidates)):
#前一个值相同的元素没有使用过,继续进行的话会导致重复
if i>0 and candidates[i] == candidates[i-1] and self.used[i-1] == 0:
continue
self.path.append(candidates[i])
self.used[i] = 1
self.backtracking(candidates, target, sum+candidates[i], i+1)
self.used[i] = 0 #回溯
self.path.pop() #回溯
131.分割回文串
class Solution:
def __init__(self):
self.res = [] #所有结果
self.path = [] #单个结果
def partition(self, s: str) -> List[List[str]]:
self.backtracking(s, 0)
return self.res
def backtracking(self, s, startindex):
if startindex >= len(s):
self.res.append(self.path[:])
return
for i in range(startindex, len(s)):
if self.isPalindrome(s, startindex, i): #是回文字符
self.path.append(s[startindex : i+1]) #这里需要注意将startindex到i的都放进结果集
self.backtracking(s, i+1)
self.path.pop() #回溯
else: #不是回文字符,跳过
continue
def isPalindrome(self, s, left, right): #双指针判断回文
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True