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提取页面内url列表的方法
May 25 Python
python 动态加载的实现方法
Dec 22 Python
详解Django 中是否使用时区的区别
Jun 14 Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 Python
python基于递归解决背包问题详解
Jul 03 Python
python配置文件写入过程详解
Oct 19 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
python函数调用,循环,列表复制实例
May 03 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
详细介绍python操作RabbitMq
Apr 12 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的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
javascript面向对象编程代码
2011/12/19 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
python开发之str.format()用法实例分析
2016/02/22 Python
python中的格式化输出用法总结
2016/07/28 Python
python数据处理实战(必看篇)
2017/06/11 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
python实现顺序表的简单代码
2018/09/28 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
给海归自荐信的建议
2013/12/13 职场文书
小学生新学期寄语
2014/01/19 职场文书
门前三包责任书
2014/04/15 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
关爱留守儿童标语
2014/06/18 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
重阳节活动主持词
2015/07/04 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python