39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
- 所有数字(包括 target)都是正整数。
- 解集不能包含重复的组合。
示例 1:
- 输入:candidates = [2,3,6,7], target = 7,
- 所求解集为: [ [7], [2,2,3] ]
示例 2:
- 输入:candidates = [2,3,5], target = 8,
- 所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
self.backtracking(candidates, target, 0, 0, [], result)
return result
def backtracking(self,candidates, target, currentSum, startIndex, path, result):
if currentSum > target:
return
if currentSum == target:
result.append(path[:])
for i in range(startIndex, len(candidates)):
currentSum += candidates[i]
path.append(candidates[i])
self.backtracking(candidates, target, currentSum, i, path, result)
currentSum -= candidates[i]
path.pop()
40.组合总和II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。
- 示例 1:
- 输入: candidates = [10,1,2,7,6,1,5], target = 8,
- 所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
- 示例 2:
- 输入: candidates = [2,5,2,1,2], target = 5,
- 所求解集为:
[
[1,2,2],
[5]
]
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
candidates.sort()
self.backtracking(candidates, target, 0, 0, [], result)
return result
def backtracking(self,candidates, target, currentSum, startIndex, path, result):
if currentSum == target:
result.append(path[:])
return
for i in range(startIndex, len(candidates)):
if i > startIndex and candidates[i] == candidates[i-1]:
continue
if currentSum + candidates[i] > target:
break
currentSum += candidates[i]
path.append(candidates[i])
self.backtracking(candidates, target, currentSum, i+1, path, result)
currentSum -= candidates[i]
path.pop()
131.分割回文串
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]
class Solution:
def partition(self, s: str) -> List[List[str]]:
result = []
self.backtracking(s, 0, [], result)
return result
def is_palindrome(self, s, start, end):
i = start
j = end
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
def backtracking(self, s, startIndex, path, result):
if startIndex == len(s):
result.append(path[:])
return
for i in range(startIndex, len(s)):
if self.is_palindrome(s, startIndex, i):
path.append(s[startIndex : i+1])
self.backtracking(s, i+1, path, result)
path.pop()