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写的服务监控程序实例
Jan 31 Python
python实现查询苹果手机维修进度
Mar 16 Python
python Django框架实现自定义表单提交
Mar 25 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
Python3.6简单反射操作示例
Jun 14 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
Python collections.deque双边队列原理详解
Oct 05 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读取MySQL数据代码
2008/06/05 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php日期操作技巧小结
2016/06/25 PHP
javascript插入样式实现代码
2012/02/22 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
python能开发游戏吗
2020/06/11 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
存储过程和函数的区别
2013/05/28 面试题
毕业生自我推荐
2013/11/04 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
大足石刻导游词
2015/02/02 职场文书
遗嘱格式范本
2015/08/07 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL