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的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
python多线程实现TCP服务端
Sep 03 Python
python创建学生管理系统
Nov 22 Python
Python爬虫解析网页的4种方式实例及原理解析
Dec 30 Python
Python 串口通信的实现
Sep 29 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
js变换显示图片的实例
2013/04/16 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python访问抓取网页常用命令总结
2017/04/11 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
关于Python数据结构中字典的心得
2017/12/04 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
解决Python使用列表副本的问题
2019/12/19 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
工作保证书怎么写
2015/02/28 职场文书