回溯算法-Python

代码框架

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’]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值