码迷,mamicode.com
首页 > 编程语言 > 详细

最长公共子序列python实现

时间:2014-05-13 07:57:53      阅读:538      评论:0      收藏:0      [点我收藏+]

标签: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.递归定义最优值

bubuko.com,布布扣

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(‘‘)
bubuko.com,布布扣

运行结果输出如下:
bubuko.com,布布扣

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

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


最长公共子序列python实现,布布扣,bubuko.com

最长公共子序列python实现

标签:python   最长公共子序列   动态规划   

原文地址:http://blog.csdn.net/littlethunder/article/details/25637173

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!