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获得时间的实例说明
Mar 25 Python
Python中subprocess模块用法实例详解
May 20 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
pow在python中的含义及用法
Jul 11 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
Python能做什么
Jun 02 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
PHP中,文件上传
2006/12/06 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
python静态方法实例
2015/01/14 Python
python从入门到精通(DAY 2)
2015/12/20 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
泰国网上购物:Shopee泰国
2018/09/14 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
大学生职业规划书的范本
2014/02/18 职场文书
总经理的岗位职责
2014/02/23 职场文书
教师年度考核评语
2014/04/28 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
医院合作意向书范本
2015/05/08 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
Nginx配置根据url参数重定向
2022/04/11 Servers