相似度:最长公共子序列--LCS

本文介绍了最长公共子序列(LCS)的概念,包括子序列、公共子序列以及最长公共子序列的定义。通过暴力枚举法展示了问题的复杂性,然后详细讲解了动态规划法解决LCS问题的思想,并通过实例展示了动态规划法的实战应用,最终得出最长公共子序列的长度为4。

一、概念

1、子序列

一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序)。如序列[A,B,C,B,D,A,B]的子序列有:[A,B],[B,C,A],[A,D,A,B]等.。

2、公共子序列

给定序列X和Y,序列Z是X的子序列,也是Y的子序列,则Z是X和Y的公共子序列。例如X=[A,B,C,B,D,A,B],Y=[B,D,C,A,B,A],那么序列Z=[B,C,A]为X和Y的公共子序列,其长度为3。

3.最长公共子序列

上述Z=[B,C,A]不是X和Y的最长公共子序列,存在序列[B,C,B,A]和[B,D,A,B]为X和Y的公共子序列,长度为4,因为X和Y不存在长度大于等于5的公共子序列,所以长度为4的公共子序列为最长公共子序列。

二、暴力枚举法

假设序列A有n个元素,序列B有m个元素,那么A、B分别有2^n,2^m个子序列,如果任意两个子序列一一比较,那么这时候的的算法复杂度为至少是2^(m+n),随序列长度指数增长,这对长序列是不适用的。

三、动态规划法

1、思想

假设存在序列A长度为M, 序列B长度为N,生成大小为(M+1)*(N+1)的矩阵dp, 初始元素全部为0
(1)Ax代表字符串A的前i个字符组成的序列,By代表字符串B的前j个字符组成的序列
(2)Ax[i]代表字符串A的第i个字符,i>0;By[j]代表字符串B的第j个字符,j>0;
(3)dp[i][j] 代表序列Ax与序列By的最长公共子序列的长度
解法如下:
1)如果Ax[i] = By[j],由于最长公共子序列为非连续序列,那么Ax和By的最长公共子序列LCS的最后一个元素即为当前元素,所以: dp[i][j]=dp[i-1][j-1]+1
即历史最长公共子序列的长度加1
2)如果Ax[i] != By[j],那

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值