字符串算法——求最长公共子序列(摘自算法基础,没有代码)

来源:互联网 发布:nginx conf 配置 编辑:程序博客网 时间:2024/05/26 05:53

求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)说返回的字符串


0 0
原创粉丝点击