39. 组合总和:
代码思路
回溯的思想依然是for循环一边递归函数。
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
def bt(node_index, ans_lis, temp_sum):
if temp_sum == target:
res.append(ans_lis)
for i in range(node_index, len(candidates)):
if temp_sum > target:
break
bt(i, ans_lis + [candidates[i]], temp_sum+candidates[i])
for node_index in range(len(candidates)):
bt(node_index, [candidates[node_index]], candidates[node_index])
return res
40. 组合总和 II:
代码思路
这里主要是要考虑什么时候跳过重复答案。其余基本思路和上面一致。
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
sorted_list = sorted(candidates)
res = []
def bt(node_index, ans_list, temp_sum):
if temp_sum == target:
res.append(ans_list)
for i in range(node_index+1, len(sorted_list)):
if i > node_index+1 and sorted_list[i] == sorted_list[i-1]:
continue
if temp_sum > target:
break
bt(i, ans_list+[sorted_list[i]], temp_sum+sorted_list[i])
for i in range(len(sorted_list)):
if i > 0 and sorted_list[i] == sorted_list[i-1]:
continue
bt(i, [sorted_list[i]], sorted_list[i])
return res
131. 分割回文串:
代码思路
思路其实就是先划第一刀,剩下的再慢慢划,深度就是划到列表所有字符凑起来等于原字符长度就停止。然后还要判断两个字符串是否是回文串,我用的是str = str[::-1]
这题比较烦的就是列表和字符串的转换,要细心一点。
class Solution:
def partition(self, s: str) -> List[List[str]]:
str_list = list(s)
res = []
def bt(node_index, ans_lis):
if len("".join(ans_lis)) == len(s):
res.append(ans_lis)
return
for i in range(node_index + 1, len(str_list)):
if str_list[node_index + 1:i + 1] == str_list[node_index + 1:i + 1][::-1]:
bt(i, ans_lis + ["".join(str_list[node_index + 1:i + 1])])
else:
continue
for i in range(len(str_list)):
if "".join(str_list[:i+1]) == "".join(str_list[:i+1])[::-1]:
bt(i, ["".join(str_list[:i+1])])
return res
文章提供了三个使用Python的回溯算法解决的编程问题:组合总和、组合总和II以及分割回文串。在组合总和问题中,算法寻找给定数组中所有可能的数的组合,使得它们的和为目标值;组合总和II则考虑了避免重复组合;分割回文串问题要求将字符串分割成多个回文子串。每个问题都通过递归函数和for循环实现,涉及到列表操作和字符串判断。
743

被折叠的 条评论
为什么被折叠?



