python 最长公共子序列长度_python实现最长公共子序列

本文介绍了使用Python解决最长公共子序列问题的动态规划方法。通过动态规划的三个步骤,详细讲解了如何找出两个序列的最长公共子序列,并提供了代码实现和运行结果解析。
摘要由CSDN通过智能技术生成

最长公共子序列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.递归定义最优值

a86c847a9835d36778060ea7b22cc153.png

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('')

8f36c549c3d20fc0a3f993a7402e3fba.png

运行结果输出如下:

79f997c0e2b3379043b338d2d033a88d.png

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值