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连接oracle数据库实例
Oct 17 Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 Python
基于python+selenium的二次封装的实现
Jan 06 Python
tensorflow使用指定gpu的方法
Feb 04 Python
哪些是python中web开发框架
Jun 17 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Python3爬虫中Ajax的用法
Jul 10 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
python 实现弹球游戏的示例代码
Nov 17 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
Flask response响应的具体使用
Jul 15 Python
Python Pygame实战之塔防游戏的实现
Mar 17 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
模拟flock实现文件锁定
2007/02/14 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
php中如何执行linux命令详解
2018/11/06 PHP
Document 对象的常用方法
2009/07/31 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
Python实现将文本生成二维码的方法示例
2017/07/18 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Django celery异步任务实现代码示例
2020/11/26 Python
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
教师评优事迹材料
2014/01/10 职场文书
追悼会主持词
2014/03/20 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
死亡证明书样本说明
2014/10/18 职场文书
2014年检验员工作总结
2014/11/19 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
Python图像处理之图像拼接
2021/04/28 Python