39. 组合总和
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
题目链接:39. 组合总和
在这里插入代码片class Solution:
def __init__(self):
self.path = []
self.paths = []
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.path.clear()
self.paths.clear()
self.trackbacking(candidates, target, 0, 0)
return self.paths
def trackbacking(self, candidates: List[int], target: int, sum_: int, start_index: int) -> None:
if sum_ == target:
self.paths.append(self.path[:])
return
if sum_ > target: # 大于所要的值则返回
return
for i in range(start_index, len(candidates)):
sum_ += candidates[i]
self.path.append(candidates[i])
self.trackbacking(candidates, target, sum_, i) # 回溯
sum_ -= candidates[i]
self.path.pop()
40.组合总和II
题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
题目链接:40.组合总和II
class Solution:
def __init__(self):
self.path = []
self.paths = []
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
self.path.clear()
self.paths.clear()
candidates.sort() # 排序,方便找出相同的数字
self.trackbacking(candidates, target, 0, 0)
return self.paths
def trackbacking(self, candidates: List[int], target: int, Sum: int, start_index: int) -> None:
if Sum == target:
self.paths.append(self.path[:])
return
for i in range(start_index, len(candidates)):
if Sum + candidates[i] > target:
return
if i > start_index and candidates[i] == candidates[i - 1]:
continue
Sum += candidates[i]
self.path.append(candidates[i])
self.trackbacking(candidates, target, Sum, i + 1)
self.path.pop()
Sum -= candidates[i]
131.分割回文串
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
题目链接:131. 分割回文串
class Solution:
def __init__(self):
self.path = []
self.paths = []
def partition(self, s: str) -> List[List[str]]:
self.path.clear()
self.paths.clear()
self.trackbacking(s, 0)
return self.paths
def trackbacking(self, s: str, start_index: int) -> None:
if start_index >= len(s):
self.paths.append(self.path[:])
return
for i in range(start_index, len(s)):
temp = s[start_index: i + 1]
if temp == temp[::-1]:
self.path.append(temp)
self.trackbacking(s, i + 1)
self.path.pop()
else:
continue