457 字
2 分钟
代码随想录算法训练营第二十天 | 回溯算法 Part02

组合总和问题#

组合总和是回溯算法的经典应用,目标是在给定的数字集合中找出所有和为目标值的组合。
核心考点包括:

  • 是否允许重复使用数字。
  • 是否存在数组中有重复元素
  • 如何剪枝优化搜索。

39. 组合总和#

LeetCode 39. 组合总和

class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.path = [] # 当前组合路径
self.res = [] # 所有合法组合
self.sum = 0 # 当前组合的总和
candidates.sort() # 排序用于剪枝
self.backtrack(candidates, target, 0)
return self.res
def backtrack(self, candidates, target, start):
if self.sum == target:
self.res.append(self.path[:])
return
for i in range(start, len(candidates)):
if self.sum + candidates[i] > target: # 剪枝
break
self.sum += candidates[i]
self.path.append(candidates[i])
self.backtrack(candidates, target, i) # 可重复使用元素:i 而不是 i+1
self.sum -= candidates[i]
self.path.pop()

40. 组合总和 II#

LeetCode 40. 组合总和 II

class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
self.path = []
self.res = []
self.sum = 0
candidates.sort() # 排序后方便跳过重复元素
self.backtrack(candidates, target, 0)
return self.res
def backtrack(self, candidates, target, start):
if self.sum == target:
self.res.append(self.path[:])
return
for i in range(start, len(candidates)):
if candidates[i] + self.sum > target:
break # 剪枝
# 这里判断 i > start 而不是 i > 0 是因为我们需要跳过同一层的重复元素
if i > start and candidates[i] == candidates[i - 1]:
continue # 跳过同层重复
self.sum += candidates[i]
self.path.append(candidates[i])
self.backtrack(candidates, target, i + 1) # 元素不可重复使用:i+1
self.sum -= candidates[i]
self.path.pop()

131. 分割回文串#

LeetCode 131. 分割回文串

class Solution:
def partition(self, s: str) -> List[List[str]]:
self.path = [] # 当前回文分割路径
self.res = [] # 所有合法回文组合
self.backtrack(s, 0)
return self.res
def backtrack(self, s, start):
if start == len(s):
self.res.append(self.path[:])
return
for i in range(start, len(s)):
if not self.isPalindrome(s, start, i):
continue
self.path.append(s[start:i + 1]) # 做选择
self.backtrack(s, i + 1) # 递归处理剩余子串
self.path.pop() # 撤销选择
def isPalindrome(self, s, l, r):
while l < r:
if s[l] != s[r]:
return False
l += 1
r -= 1
return True
代码随想录算法训练营第二十天 | 回溯算法 Part02
https://fuwari.vercel.app/posts/code_musings_day_twenty/
作者
Jarrett
发布于
2025-07-03
许可协议
CC BY-NC-SA 4.0