最长公共子序列 (longest common subsequence)

子序列定义:将给定序列中零个或多个元素去掉之后得到的结果
    比如abcd是abecd的子序列
    
最长公共子序列问题:给定两个序列X和Y,求两者长度最长的公共子序列

1. 最长公共子序列的特征
    X = <x1, x2, ..., xn>,Y = <y1, y2, ..., yn>;Z = <z1, z2, ..., zn>是两者的任意LCS
    1) 如果xm = yn, 则zk = xm = yn且Zk-1是Xm-1和Yn-1的一个LCS
    2) 如果xm != yn,那么zk != xm 意味着Z是Xm-1和Yn的一个LCS
    3) 如果xm != yn,那么zk != yn意味着Z是Xm和Yn-1的一个LCS
2. 递归解
    c[i, j]表示Xi和Yj的LCS的长度;则
    c[i, j] = 0        若i = 0 或  j = 0
                c[i-1, j-1] + 1        若i, j > 0且xi = yj
                max(c[i-1, j], c[i, j-1])        若i, j>0且xi != yj
3. 自底向上计算

4. 构造LCS
    可以在自底向上计算过程中,保存子问题最优解
    当xi == yj                    b[i, j] = equal
    当c[i-1, j] > c[i, j-1]     b[i, j] = left
    当 c[i-1, j] < c[i, j-1]     b[i, j] = right
    从而可以如下构造LCS

PRINT-LCS(b, X, i, j)
    if i==0 or j==0
        return
    if b[i, j] == equal
        PRINT-LCS(b, X, i-1, j-1)
        print Xi
    elseif b[i, j] == left
        PRINT-LCS(b, X, i-1, j)
    else
        PRINT-LCS(b, X, i, j-1)

算法的改进,可以在构造LCS时,直接利用数组c的大小比较来判断,而不需要数组b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值