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中list列表的高级函数
May 17 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
python的变量与赋值详细分析
Nov 08 Python
python决策树之CART分类回归树详解
Dec 20 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
pandas重新生成索引的方法
Nov 06 Python
python实现图片彩色转化为素描
Jan 15 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
查看端口并杀进程python脚本代码
Dec 17 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python Shapely使用指南详解
Feb 18 Python
Python3合并两个有序数组代码实例
Aug 11 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中防止SQL注入的最佳解决方法
2013/04/25 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
微信小程序实现留言板
2018/10/31 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python常用小技巧总结
2015/06/01 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
简单介绍django提供的加密算法
2019/12/18 Python
Django 再谈一谈json序列化
2020/03/16 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
python主要用于哪些方向
2020/07/05 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
机关财务管理制度
2014/01/17 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
升国旗仪式主持词
2014/03/19 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书