27天【代码随想录算法训练营34期】第七章 回溯算法part03(● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串)
39. 组合总和
怎么才能避免重复?比现在数小的数就别append到path里面了,之前肯定都试过了
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
candidates.sort()
self.backtracking(candidates, 0, [], target, result)
return result
def backtracking(self, candidates, startingIndex, path, sum_, result):
if sum_ == 0:
result.append(path[:])
return
for i in range(startingIndex, len(candidates)):
if sum_ - candidates[i] < 0:
break
path.append(candidates[i])
self.backtracking(candidates, i, path, sum_-candidates[i], result)
path.pop()
40.组合总和II
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
candidates.sort()
self.backtracking(candidates, result, target, [], 0)
return result
def backtracking(self, candidates, result, sum_, path, startingIndex):
if sum_ == 0:
result.append(path[:])
return
for i in range(startingIndex, len(candidates)):
if i > startingIndex and candidates[i] == candidates[i-1]:
continue
if candidates[i] > sum_:
break
path.append(candidates[i])
self.backtracking(candidates, result, sum_ - candidates[i], path, i+1)
path.pop()
131.分割回文串
class Solution:
def partition(self, s: str) -> List[List[str]]:
result = []
self.backtracking(s, [], 0, result)
return result
def backtracking(self, s, path, index, result):
if index >= len(s):
result.append(path[:])
return
for i in range(index, len(s)):
if self.is_palindrome(s, index, i):
path.append(s[index:i+1])
self.backtracking(s, path, i+1, result)
path.pop()
def is_palindrome(self, s, start, end):
while start <= end:
if s[start] != s[end]:
return False
start += 1
end -= 1
return True
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步