代码框架
res = []
def backtrack(选择列表, 路径):
if 满足结束条件:
res.append(路径):
return
for 选择 in 选择列表:
做选择
backtrack(选择列表, 路径):
撤销选择
全排列
nums = [1,2,3]
res = []
def backtrack(nums,pos,end):
if pos == end:
res.append(nums[:])
return res
for i in range(pos,end):
nums[i],nums[pos] = nums[pos],nums[i]
backtrack(nums,pos+1,end)
nums[i],nums[pos] = nums[pos],nums[i]
backtrack(nums,0,len(nums))
print(res)
输出:[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]
求子集和
给定一个数组和一个值,求数组里等于该值的子集
def Backtrack(t,s):
if t == n:
if s == sum_num:
tmp = []
for i in range(0,n):
if x[i] != 0:
tmp.append(arr[i])
res.append(tmp)
return res
else:
s = s+arr[t]
x[t] = arr[t]
Backtrack(t+1,s)
s = s-arr[t] #回溯之前还原
x[t] = 0
Backtrack(t+1,s)
t = 0 #递归深度
s = 0 #子集和
x = {} #判断列表,状态为1或0
res = []
arr = [2,2,6,5,4]
n = len(arr)
sum_num = 10
Backtrack(t,s)
print(res)
输出:[[2, 2, 6], [6, 4]]
组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
n = 4
k = 2
arr = []
res = []
def backtrack(pos,end,k):
if len(arr) == k:
res.append(arr[:])
return res
for i in range(pos,end+1):
arr.append(i)
backtrack(i+1,end,k)
arr.pop()
backtrack(1,n,k)
print(res)
输出:[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
大小写全排列
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合
s ='a1b2'
res = []
def backtrack(s,pos):
res.append(s)
for i in range(pos,len(s)):
if s[i].isalpha():
backtrack(s[:i]+s[i].swapcase()+s[i+1:],i+1)
return
backtrack(s,0)
print(res)
输出:[‘a1b2’, ‘A1b2’, ‘A1B2’, ‘a1B2’]