求LCS的长度
程序 COMPUTE_LCS_TABLE(X,Y)
输入: X和Y:两个长度分别为m和n的字符串
输出: 数组l[0...m,0...n]。l[m,n]的值为X和Y的最长公共子序列的长度
步骤:
1.创建一个新数组l[0...m,0...n]
2.令i从0~m依次取值
A.将l[i,0]赋值为0
3.令j从0~n依次取值
A.将l[0,j]赋值为0
4.令i从1~m依次取值
A.令j从1~n依次取值
i.如果xi与yj相同,那么将l[i,j]赋值为l[i-1,j-1]+1
ii.否则(xi与yj不同),将l[i,j]赋值为l[i,j-1]和l[i-1,j]中的较大值。如果l[i,j-1]等于l[i-1,j],将l[i,j]取l[i,j-1]或l[i-1,j]均可。
5.返回数组l
接下来,利用COMPUTE_LCS_TABLE(X,Y)来逆序得到LCS。
程序 ASSEMBLE_LCS(X,Y,l,i,j)
输入 X和Y:两个字符串
l:调用COMPUTE_LCS_TABLE程序返回的填充好的数组
i和j:分别指向数组X和Y的索引,以及指向数组l的索引
输出 Xi和Yj的LCS(最长公共子序列)
步骤
1.如果l[i,j]等于0,那么返回空串
2.否则(因为l[i,j]大于0,i和j均大于0),如果xi等于yj,那么返回由递归调用ASSEMBLE_LCS(X,Y,l,i-1,j-1)说返回的字符串,再在返回的字符串的末尾加上xi(或者yj)所组成的字符串
3.否则(xi不等于yj),如果l[i,j-1]大于l[i-1,j],那么返回递归调用ASSEMBLE_LCS(X,Y,l,i,j-1)所返回的字符串
4.否则(xi不等于yj并且l[i,j-1]小于等于l[i-1,j]),那么返回递归调用ASSEMBLE_LCS(X,Y,l,i-1,j)说返回的字符串