39 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
def backtracking(canditates,target,total,statrIndex,path,result):if total==target:result.append(path[:])return for i in range(startIndex,len(candidates)):if total+candidates[i]>target:breaktotal+=candidates[i]path.append(candidates[i])backtracking(candidates,target,total,i,path,result)total-=candidates[i]path.pop()
def combinationSum(candidates:'List[int]', target:int)->'List[List[int]]':result=[]candidates.sort() # 剪枝 不写这个,需要上面的break换成continuebacktracking(condidates,target,0,0,[],result)return result
40 组合总和II
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
def backtracking(candidates,target,total,startIndex,path,result):if total==target:result.append(path[:])return for i in range(startIndex,len(candidates)):if i>startIndex and candidates[i]==candidates[i-1]:continueif total+candidates[i]>target:breaktotal+=candidates[i]path.append(candidates[i])backtracking(candidates,target,total,i+1,path,result)total-=candidates[i]path.pop()
def combinationSum2(candidates:'List[int]',target:'int')->'List[List[int]]':result=[]candidates.sort()backtracking(candidates,target,0,0,[],result)return result
131 分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。
def isPalindrome(s):return all(s[i]==s[len(s)-1-i] for i in range(len(s)//2))
def backtracking(s,startIndex,path,result):if startIndex==len(s):result.append(path[:])returnfor i in range(startIndex+1,len(s)+1):sub=s[startIndex,i]if isPalindrome(sub): # s[startIndex:i]==s[startIndex:i][::-1]path.append(sub) # path.append(s[startIndex:i])backtracking(s,i,path,result)path.pop()def partition(s:str)->'List[List[str]]':result=[]backtracking(s,0,[],result)return result