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中使用Inotify监控文件实例
Feb 14 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
Python中一些不为人知的基础技巧总结
May 19 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 Python
下载官网python并安装的步骤详解
Oct 12 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
pycharm 关掉syntax检查操作
Jun 09 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
python中entry用法讲解
Dec 04 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
php读取远程gzip压缩网页的方法
2014/12/29 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
Redis构建分布式锁
2017/03/28 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
PHP反射基础知识回顾
2020/09/10 PHP
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python 多线程串行和并行的实例
2019/02/22 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Python接口测试结果集实现封装比较
2020/05/01 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
复古服装:RetroStage
2019/05/10 全球购物
养殖行业的创业计划书
2014/01/05 职场文书
中式面点餐厅创业计划书
2014/01/29 职场文书
正科级干部考察材料
2014/05/29 职场文书
装配出错检讨书
2014/09/23 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
办公室主任个人总结
2015/02/28 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript