3道题目
39. 组合总和
40. 组合总和 II
131. 分割回文串
解题理解
39
跟之前的组合体一个模板,而且这道题因为可以重复选择,所以在递归下去的时候,起始点可以不再是下一个位置
class Solution:
def __init__(self):
self.res = []
self.path = []
def backtracking(self, candidates, target, start, sum):
if sum > target:
return
if sum == target:
self.res.append(self.path[:])
return
for i in range(start, len(candidates)):
sum += candidates[i]
self.path.append(candidates[i])
self.backtracking(candidates, target, i, sum)
sum -= candidates[i]
self.path.pop()
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.backtracking(candidates, target, 0, 0)
return self.res
40
树层重复配合树枝去重的思路太巧妙,都是刚刚好的设计
class Solution:
def __init__(self):
self.res = []
self.path = []
def backtracking(self, candidates, target, start, used, sum):
if sum > target:
return
if sum == target:
self.res.append(self.path[:])
return
for i in range(start, len(candidates)):
if i > start and candidates[i] == candidates[i - 1] and not used[i - 1]:
//当前一个标志位为False时,说明当下下标元素往后的位置都不用考虑了
continue
self.path.append(candidates[i])
sum += candidates[i]
used[i] = True
self.backtracking(candidates, target, i + 1, used, sum)
self.path.pop()
sum -= candidates[i]
used[i] = False
def combinationSum2(self, candidates, target):
candidates.sort()
used = [False] * len(candidates)
self.backtracking(candidates, target, 0, used, 0)
return self.res
131
中间逻辑都是可以想出来的,终止条件想复杂了,其实只需要确定切割点到字符串末尾就好
class Solution:
def __init__(self):
self.path = []
self.res = []
def judge(self, s):
return s[:] == s[::-1]
def backtracking(self, s, start):
if start >= len(s):
self.res.append(self.path[:])
for i in range(start, len(s)):
if self.judge(s[start: i + 1]):
self.path.append(s[start: i + 1])
else:
continue
self.backtracking(s, i + 1)
self.path.pop()
def partition(self, s: str) -> List[List[str]]:
self.backtracking(s, 0)
return self.res