def backtrack(res, result, start, target):
if target <= 0:
if target < 0: return
res.append(list(result))
for i in range(start, len(candidates)):
result.append(candidates[i])
backtrack(res, result, i, target-candidates[i])
result.pop()
res = []
backtrack(res, [], 0, target)
return res
LeetCode.40 组合总和II
candidates.sort()
def backtrack(res, result, start, target):
if target == 0:
res.append(list(result))
for i in range(start, len(candidates)):
if target - candidates[i] < 0:
break
if i > start and candidates[i] == candidates[i-1]:
continue
result.append(candidates[i])
backtrack(res, result, i+1, target-candidates[i])
result.pop()
res = []
backtrack(res, [], 0, target)
return res
LeetCode.131 分割回文串
def a(text):
if not text: return True
if text[0] != text[-1]: return False
return a(text[1:-1])
def backtrack(res, result, start):
if start == len(s):
res.append(list(result))
return
for i in range(start, len(s)):
if not a(s[start:i+1]): continue
result.append(s[start:i+1])
backtrack(res, result, i+1)
result.pop()
res = []
backtrack(res, [], 0)
return res