LCS算法

LCS-最长公共子序列



其实有两个概念容易模糊:

1:最长公共字串
2:最长公共子序列

最长公共子串其实是连续的字符串,而最长公共子序列只要顺序不发生改变就可以。比如abcde, hbcxdo这样两个字符串
最长公共子串是:bc
最长公共子序列是:bcd

想法:

我们可以通过动态规划的思路来思考
假设字符串Xn, Ym 然后最长公共子序列是 Zk
(n, m, k代表字符串长度)

Xn:{x1, x2, x3……xn}
Ym: {y1, y2, y3……ym}
Zk:{z1, z2, z3……zk}

LCS(Xn, Ym)= Zk
当X, Y字符串最后一个字符相等(xn==ym),那么必定符合(zk==(xn , ym))。所以我们可以简化为LCS(Xn-1, Ym-1)=Zk-1
如果xn != ym,那么Zk等于LCS(Xn-1, Ym)或者LCS(Xn, Ym-1)

实现:

使用一个二维数组dp[i][j]来记录LCS(Xi, Yj)的长度
这里写图片描述


举例:

abcde 和 hbcxdo

i0123456
00000000
10000000
20011111
30012222
40012233
50012233



代码实现:

int LCS(char s[]){
    int len = strlen(s);
    memset (dp, 0, sizeof(dp));
    for (int i = 1; i <= len; ++ i){
        for (int j = 1; j <= len; ++ j){
            if (s[i - 1] == s[len - j]) dp[i][j] = dp[i - 1][j - 1] + 1;
            else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
        }
    }   
    return dp[len][len];
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值