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测试驱动开发实例
Oct 08 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
python+pyqt实现右下角弹出框
Oct 26 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
python机器学习之KNN分类算法
Aug 29 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
基于CentOS搭建Python Django环境过程解析
Aug 24 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的聊天室设计
2006/10/09 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
动态加载iframe
2006/06/16 Javascript
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python实现简单http服务器
2018/04/12 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
Python中的面向接口编程示例详解
2021/01/17 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
音乐表演专业毕业生求职信
2013/10/14 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
房地产项目建议书
2014/03/12 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
科普 | 业余无线电知识-波段篇
2022/02/18 无线电