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

根据《算法导论》中动态规划一章介绍的最长公共子序列原理,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,c

def 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 '方向变化:',b
print '矩阵值:',c
print '最长公共子序列为:'
print_LCS(b, x, len(x), len(y))

你可能感兴趣的:(python,函数)