python实现最长公共子序列

yipeiwu_com6年前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求两个list的差集、交集与并集的方法

本文实例讲述了Python求两个list的差集、交集与并集的方法。分享给大家供大家参考。具体如下: list就是指两个数组之间的差集,交集,并集了,这个小学数学时就学过的东西,下面就以实...

Python冒泡排序注意要点实例详解

冒泡排序注意三点: 1. 第一层循环可不用循环所有元素。 2.两层循环变量与第一层的循环变量相关联。 3.第二层循环,最终必须循环集合内所有元素。 示例代码一: 1.第一层循环,只循环...

pycharm中成功运行图片的配置教程

pycharm中成功运行图片的配置教程

如下: 经历了半个月 艰辛配置工作终于运行出图片了 结果 import cv2 import numpy as np img = cv2.imread("66.jpg")...

基于Python 中函数的 收集参数 机制

定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数。返回结果是一个元组。 传递零个参数时函数并不报错,而是返回一个空元组。但以上这种方法也有局限性,它不能收集关键...

python 经典数字滤波实例

python 经典数字滤波实例

数字滤波分为 IIR 滤波,和FIR 滤波。 FIR 滤波: import scipy.signal as signal import numpy as np import pyla...