Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法


Posted in Python onSeptember 08, 2017

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

问题

输入

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

输出

输出最长的子序列,如果有多个,随意输出1个。

输入示例

belong
cnblogs

输出示例

blog

分析

既然打算套用回溯法子集树模板,那就要祭出元素-状态空间分析大法。

以长度较小的字符串中的字符作为元素,以长度较大的字符串中的字符作为状态空间,对每一个元素,遍历它的状态空间,其它的事情交给剪枝函数!!!

解x的长度不固定,xi表示字符串b中的序号。

在处理每一个元素时,如果没有一个状态被选择(cnblogs中没一个字符被选取),那么程序无法去往下一个元素。

这确实是个不小的麻烦!!!思考了一天,终于想出办法了:扩充状态空间,增加一个状态q!如果元素选取了状态q,它是合法的。但是,状态q不加入解x内!!!

看一个直观的图:

Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法

至此,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使用回溯法子集树模板获取最长公共子序列(LCS)的方法

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
python计算auc指标实例
Jul 13 Python
彻底理解Python list切片原理
Oct 27 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
django中间键重定向实例方法
Nov 10 Python
python 多进程队列数据处理详解
Dec 23 Python
opencv python图像梯度实例详解
Feb 04 Python
Python datetime 格式化 明天,昨天实例
Mar 02 Python
完美解决jupyter由于无法import新包的问题
May 26 Python
python实现的web监控系统
Apr 27 Python
python中实现指定时间调用函数示例代码
Sep 08 #Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
Sep 08 #Python
python中实现延时回调普通函数示例代码
Sep 08 #Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 #Python
老生常谈Python startswith()函数与endswith函数
Sep 08 #Python
python学习必备知识汇总
Sep 08 #Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 #Python
You might like
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
Vue+webpack项目基础配置教程
2018/02/12 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
中国跨境电商:Tomtop
2017/03/16 全球购物
毕业生自我鉴定
2013/12/04 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
音乐教师求职信
2014/06/28 职场文书
青年标兵事迹材料
2014/08/16 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
2015个人半年总结范文
2015/03/09 职场文书
用人单位聘用意向书
2015/05/11 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL