动态规划最长公共子序列(LCS)问题(Java实现)

本文介绍了动态规划求解最长公共子序列(LCS)问题,区别了公共子序列和公共子串的概念,并通过Java代码详细展示了如何利用动态规划算法自底向上地解决此问题,降低了时间复杂度。
摘要由CSDN通过智能技术生成

动态规划最长公共子序列(LCS)问题(Java实现)

首先,明白一个公共子序列和公共子串的区别

  • 公共子序列: 可以不连续
  • 公共子串: 必须连续

问题分析

  1. 求最长公共子序列,先明白两个概念

    • 子序列
      • 一个给定序列中删去若干元素后得到的序列
    • 公共子序列
      • 给定两个序列X,Y,当另一序列Z 既是X 的子序列,又是Y 的子序列时,就称Z 为X、Y 的 公共子序列
  2. 明白上述两个概念后,我们就可以开始搜索最长公共子序列

    • 这个问题可以使用暴力方法解决,但是由于要全部搜索一遍,时间复杂度为 O(n2 m ) ,所以我们不采用
    • 我们可以使用动态规划算法,自底向上进行搜索,这样,在计算后面的时候,前面的数据我们已经对其进行保存,直接进行计算即可,时间复杂度很大程度降低。
  3. 既然决定使用动态规划算法,首先引入一个二位数组 c[][], 记录 x[i] 与 y[j] 的LCS 的长度,b[i][j] 记录 c[i][j] 的通过哪一个子问题的值求得的,以决定搜索方向。

  4. 抽取状态转移方程(X=x 1 x 2 ...x m 、Y=y 1 y 2 ...y n 为两个序列,Z=z 1 z 2 ...z k 为公共子序列)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值