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中文乱码的解决方法
Nov 04 Python
Python实现控制台输入密码的方法
May 29 Python
Python写的一个简单监控系统
Jun 19 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
使用Python函数进行模块化的实现
Nov 15 Python
python线程join方法原理解析
Feb 11 Python
python算的上脚本语言吗
Jun 22 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
python基础学习之生成器与文件系统知识总结
May 25 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
PHP静态类
2006/11/25 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
理解JavaScript的变量的入门教程
2015/07/07 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
举例详解Python中的split()函数的使用方法
2015/04/07 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
python在文本开头插入一行的实例
2018/05/02 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
软件工程师面试题
2012/06/25 面试题
班班通校本培训方案
2014/03/12 职场文书
超市活动计划书
2014/04/24 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
北京爱情故事观后感
2015/06/12 职场文书
如何在Python项目中引入日志
2021/05/31 Python
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS