本文实例讲述了Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法。分享给大家供大家参考,具体如下:

问题
输入
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
belong
cnblogs
输出示例
blog
分析
既然打算套用回溯法子集树模板,那就要祭出元素-状态空间分析大法。
以长度较小的字符串中的字符作为元素,以长度较大的字符串中的字符作为状态空间,对每一个元素,遍历它的状态空间,其它的事情交给剪枝函数!!!
解x的长度不固定,xi表示字符串b中的序号。
在处理每一个元素时,如果没有一个状态被选择(cnblogs中没一个字符被选取),那么程序无法去往下一个元素。
这确实是个不小的麻烦!!!思考了一天,终于想出办法了:扩充状态空间,增加一个状态q!如果元素选取了状态q,它是合法的。但是,状态q不加入解x内!!!
看一个直观的图:
至此,enjoy it!
代码
'''最长公共子序列'''
# 作者:hhh5460
# 时间:2017年6月3日
a = 'belong'
b = 'cnblogs'
x = [] # 一个解(长度不固定)xi是b中字符的序号
X = [] # 一组解
best_x = [] # 最佳解
best_len = 0 # 最大子序列长度
# 冲突检测
def conflict(k):
global n, x, X, a,b,best_len
# 如果两个字符不相等
if x[-1] < len(b) and a[k] != b[x[-1]]:
return True
# 如果两个字符相等,但是相对于前一个在b中的位置靠前
if a[k] == b[x[-1]] and (len(x) >= 2 and x[-1] <= x[-2]):
return True
# 如果部分解的长度加上后面a剩下的长度,小于等于best_len
if len(x) + (len(a)-k) < best_len:
return True
return False # 无冲突
# 回溯法(递归版本)
def LCS(k): # 到达a中的第k个元素
global x, X,a,b,best_len,best_x
#print(k, x)
if k == len(a): # 超出最尾的元素
if len(x) > best_len:
best_len = len(x)
best_x = x[:]
else:
for i in range(len(b)+1): # 遍历 状态空间:0~len(b)-1,技巧:人为增加一种状态len(b),表示改行没有元素选取
if i==len(b): # 此状态不放入解x内
LCS(k+1)
else:
x.append(i)
if not conflict(k): # 剪枝
LCS(k+1)
x.pop() # 回溯
# 根据一个解x,构造最长子序列lcs
def get_lcs(x):
global b
return ''.join([b[i] for i in x])
# 测试
LCS(0)
print(b)
print(best_x)
print(get_lcs(best_x))
效果图
更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
# Python
# 回溯法
# 子集树模板
# 最长公共子序列
# LCS
# Python求两个字符串最长公共子序列代码实例
# 详解Python最长公共子串和最长公共子序列的实现
# python实现最长公共子序列
# Python 中最长公共子序列的长度
# 遍历
# 递归
# 进阶
# 操作技巧
# 是个
# 相关内容
# 多个
# 它是
# 数据结构
# 给大家
# 如果没有
# 较小
# 想出
# 相对于
# 更多关于
# 所述
# 程序设计
# 使用技巧
# 靠前
# 没一个
相关文章:
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
定制建站哪家更专业可靠?推荐榜单揭晓
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何在IIS中新建站点并解决端口绑定冲突?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
建站与域名管理如何高效结合?
定制建站方案优化指南:企业官网开发与建站费用解析
如何在新浪SAE免费搭建个人博客?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何高效完成自助建站业务培训?
如何用腾讯建站主机快速创建免费网站?
如何自定义建站之星网站的导航菜单样式?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
如何将凡科建站内容保存为本地文件?
如何解决ASP生成WAP建站中文乱码问题?
如何通过宝塔面板实现本地网站访问?
如何用PHP快速搭建CMS系统?
已有域名和空间如何搭建网站?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
,南京靠谱的征婚网站?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
免费视频制作网站,更新又快又好的免费电影网站?
,柠檬视频怎样兑换vip?
如何快速生成橙子建站落地页链接?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
如何在腾讯云服务器快速搭建个人网站?
建站主机选购指南与交易推荐:核心配置解析
建设网站制作价格,怎样建立自己的公司网站?
深入理解Android中的xmlns:tools属性
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何通过多用户协作模板快速搭建高效企业网站?
Swift开发中switch语句值绑定模式
建站之星代理如何优化在线客服效率?
5种Android数据存储方式汇总
高端建站三要素:定制模板、企业官网与响应式设计优化
表情包在线制作网站免费,表情包怎么弄?
如何批量查询域名的建站时间记录?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何快速选择适合个人网站的云服务器配置?
建站org新手必看:2024最新搭建流程与模板选择技巧
如何通过西部建站助手安装IIS服务器?
如何在自有机房高效搭建专业网站?
简单实现Android文件上传
智能起名网站制作软件有哪些,制作logo的软件?
历史网站制作软件,华为如何找回被删除的网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何选择域名并搭建高效网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。