Python实现各类数据结构和算法---动态规划之最长公共子序列

来源:互联网 发布:爱因斯坦大脑 知乎 编辑:程序博客网 时间:2024/06/06 19:37

根据《算法导论》中动态规划一章介绍的最长公共子序列原理,python实现,原理及伪代码书籍详见p223-225

 

#coding:utf-8'''Created on 2014-3-19@author: admin'''def LCS_Lenth(x,y):    m=len(x)+1      #数组x,y从0开始,书籍上,从1开始,故加1    n=len(y)+1    #----------------------初始化矩阵----------------    c=[[0 for j in xrange(0,n)] for i in xrange(0,m)]        b=[[0 for j in xrange(0,n)] for i in xrange(0,m)]    #用0、1、2分别表示向上、向斜上方、向左,不能b=c,若是那样的话,则b,c同值同改变    #-------------------------------------------    for i in xrange(1,m):       #m=8,i从1到7        for j in xrange(1,n):   #n=7,j从1到6            if x[i-1]==y[j-1]:  #x,y从标号0开始,故这里比较的话,从i-1,j-1走起                c[i][j]=c[i-1][j-1]+1                b[i][j]=1   #向斜上            else:                if c[i-1][j]>=c[i][j-1]:                    c[i][j]=c[i-1][j]                    b[i][j]=0                else:                    c[i][j]=c[i][j-1]                    b[i][j]=2    return b,cdef print_LCS(b,x,i,j):    if i==0 and j==0:        return    if b[i][j]==1:        print_LCS(b,x,i-1,j-1)        print x[i-1],    #这里同理,要输出x[i-1]    elif b[i][j]==0:        print_LCS(b,x,i-1,j)    else:        print_LCS(b,x,i,j-1)x='ABCBDAB'y='BDCABA'b,c=LCS_Lenth(x,y)print '方向变化:',bprint '矩阵值:',cprint '最长公共子序列为:'print_LCS(b, x, len(x), len(y))

0 0
原创粉丝点击