主要内容
- 组合
- 组合排序去重
- 切割
题目
39. 组合总和
思路分析
backtracking(candidates,target, i)
不用i+1了,表示可以重复读取当前的数
代码
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
path = []
def backtracking(candidates,target, startindex):
if sum(path) >= target:
if sum(path) == target:
res.append(path[:])
return
for i in range(startindex, len(candidates)):
path.append(candidates[i])
backtracking(candidates,target, i)
path.pop()
backtracking(candidates,target, 0)
return res
40.组合总和II
思路分析
排序,去重,要对同一树层使用过的元素进行跳过
代码
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
path = []
def backtracking(candidates, target, startindex):
if sum(path) >= target:
if sum(path) == target:
res.append(path[:])
return
for i in range(startindex, len(candidates)):
# 去重
if i > startindex and candidates[i] == candidates[i - 1]:
continue
path.append(candidates[i])
backtracking(candidates, target, i + 1)
path.pop()
# 排序
backtracking(sorted(candidates), target, 0)
return res
131.分割回文串
思路分析
难点在将分割转换为组合问题,startindex是切割线
代码
正反序判断
class Solution:
def __init__(self):
self.res = []
self.path = []
def partition(self, s: str) -> List[List[str]]:
self.backtracking(s, 0)
return self.res
def backtracking(self, s: str, startindex: int):
if startindex >= len(s):
self.res.append(self.path[:])
return
for i in range(startindex, len(s)):
temp = s[startindex:i+1]
# 判断回文串
if temp == temp[::-1]:
self.path.append(temp)
self.backtracking(s, i + 1)
self.path.pop()
else:
continue
函数判断
class Solution:
def __init__(self):
self.res = []
self.path = []
def partition(self, s: str) -> List[List[str]]:
self.backtracking(s, 0)
return self.res
def backtracking(self, s: str, startindex: int):
if startindex >= len(s):
self.res.append(self.path[:])
return
for i in range(startindex, len(s)):
# 判断回文串
if self.ispartition(s, startindex, i):
self.path.append(s[startindex:i+1])
self.backtracking(s, i + 1)
self.path.pop()
else:
continue
def ispartition(self, s, start, end):
i, j = start, end
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True