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实现115网盘自动下载的方法
Sep 30 Python
Python中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
python实现七段数码管和倒计时效果
Nov 23 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
详解python 内存优化
Aug 17 Python
python利用 keyboard 库记录键盘事件
Oct 16 Python
Python中常用的os操作汇总
Nov 05 Python
利用Python读取微信朋友圈的多种方法总结
Aug 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
linux下 C语言对 php 扩展
2008/12/14 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php常用正则函数实例小结
2016/12/29 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
请说出你所知道的线程同步的方法
2013/04/19 面试题
运动会入场词50字
2014/02/20 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
销售督导岗位职责
2015/04/10 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL