最长公共子序列

最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个数列 S ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
动态规划的一个计算最长公共子序列的方法如下:
以两个序列 XY 为例子:
设有二维数组 f[i][j] 表示 Xi 位和 Yj 位之前的最长公共子序列的长度,则有:

f[1][1] = s a m e(1,1)
f[ i][ j] = m a x{ f[ i − 1][ j − 1] + s a m e( i, j), f[ i − 1][ j], f[ i][ j − 1]}

其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。
此时,f[i][j]中最大的数便是 XY 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。
算法的空间、时间复杂度均为O(n2),经过优化后,空间复杂度可为O(n),时间复杂度为O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值