python实现最长公共子序列

 更新时间:2018年05月22日 14:37:37   作者:littlethunder  
这篇文章主要为大家详细介绍了python实现最长公共子序列的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最长公共子序列python实现,最长公共子序列是动态规划基本题目,下面按照动态规划基本步骤解出来。

1.找出最优解的性质,并刻划其结构特征

序列a共有m个元素,序列b共有n个元素,如果a[m-1]==b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是a[:m-1]和b[:n-1]的最长公共子序列长度+1;如果a[m-1]!=b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是MAX(a[:m-1]和b[:n]的最长公共子序列长度,a[:m]和b[:n-1]的最长公共子序列长度)。

2.递归定义最优值


3.以自底向上大方式计算出最优值

python代码如下:

def lcs(a,b): 
  lena=len(a) 
  lenb=len(b) 
  c=[[0 for i in range(lenb+1)] for j in range(lena+1)] 
  flag=[[0 for i in range(lenb+1)] for j in range(lena+1)] 
  for i in range(lena): 
    for j in range(lenb): 
      if a[i]==b[j]: 
        c[i+1][j+1]=c[i][j]+1 
        flag[i+1][j+1]='ok' 
      elif c[i+1][j]>c[i][j+1]: 
        c[i+1][j+1]=c[i+1][j] 
        flag[i+1][j+1]='left' 
      else: 
        c[i+1][j+1]=c[i][j+1] 
        flag[i+1][j+1]='up' 
  return c,flag 
 
def printLcs(flag,a,i,j): 
  if i==0 or j==0: 
    return 
  if flag[i][j]=='ok': 
    printLcs(flag,a,i-1,j-1) 
    print(a[i-1],end='') 
  elif flag[i][j]=='left': 
    printLcs(flag,a,i,j-1) 
  else: 
    printLcs(flag,a,i-1,j) 
     
a='ABCBDAB' 
b='BDCABA' 
c,flag=lcs(a,b) 
for i in c: 
  print(i) 
print('') 
for j in flag: 
  print(j) 
print('') 
printLcs(flag,a,len(a),len(b)) 
print('') 

运行结果输出如下:


4.根据计算最优值得到的信息,构造最优解

上图是运行结果,第一个矩阵是计算公共子序列长度的,可以看到最长是4;第二个矩阵是构造这个最优解用的;最后输出一个最优解BCBA。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python缩进和冒号详解

    Python缩进和冒号详解

    下面小编就为大家带来一篇Python缩进和冒号详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 使用python制作一个简单的井字棋游戏

    使用python制作一个简单的井字棋游戏

    井字棋(Tic-Tac-Toe)是一种经典的两人棋盘游戏,通常由两名玩家轮流下棋,目标是在一个3x3的棋盘上先形成横向、纵向或对角线的三个棋子,本文将介绍如何使用 Python 制作一个简单的井字棋游戏、包括游戏规则、界面设计和实现代码,需要的朋友可以参考下
    2023-11-11
  • Python入门Anaconda和Pycharm的安装和配置详解

    Python入门Anaconda和Pycharm的安装和配置详解

    这篇文章主要介绍了Python入门Anaconda和Pycharm的安装和配置详解,文章通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 对pyqt5中QTabWidget的相关操作详解

    对pyqt5中QTabWidget的相关操作详解

    今天小编就为大家分享一篇对pyqt5中QTabWidget的相关操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python 遍历列表提取下标和值的实例

    python 遍历列表提取下标和值的实例

    今天小编就为大家分享一篇python 遍历列表提取下标和值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python+OpenCV实现信用卡数字识别的方法详解

    Python+OpenCV实现信用卡数字识别的方法详解

    这篇文章主要介绍了如何利用python opencv实现信用卡数字识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Python中 CSV格式清洗与转换的实例代码

    Python中 CSV格式清洗与转换的实例代码

    这篇文章主要介绍了Python123 CSV格式清洗与转换的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python中使用socket发送HTTP请求数据接收不完整问题解决方法

    Python中使用socket发送HTTP请求数据接收不完整问题解决方法

    这篇文章主要介绍了Python中使用socket发送HTTP请求数据接收不完整问题解决方法,本文使用一个循环解决了数据不完整问题,需要的朋友可以参考下
    2015-02-02
  • 利用python如何处理百万条数据(适用java新手)

    利用python如何处理百万条数据(适用java新手)

    这篇文章主要给大家介绍了关于利用python如何处理百万条数据的相关资料,本文的教程非常适用于java新手,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-06-06
  • Python函数式编程指南(二):从函数开始

    Python函数式编程指南(二):从函数开始

    这篇文章主要介绍了Python函数式编程指南(二):从函数开始,本文讲解了定义一个函数、使用函数赋值、闭包、作为参数等内容,需要的朋友可以参考下
    2015-06-06

最新评论