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