动态规划最长公共子序列(LCS)问题(Java实现)
首先,明白一个公共子序列和公共子串的区别
- 公共子序列: 可以不连续
- 公共子串: 必须连续
问题分析
-
求最长公共子序列,先明白两个概念
- 子序列
- 一个给定序列中删去若干元素后得到的序列
- 公共子序列
- 给定两个序列X,Y,当另一序列Z 既是X 的子序列,又是Y 的子序列时,就称Z 为X、Y 的 公共子序列
- 子序列
-
明白上述两个概念后,我们就可以开始搜索最长公共子序列
- 这个问题可以使用暴力方法解决,但是由于要全部搜索一遍,时间复杂度为 O(n2 m ) ,所以我们不采用
- 我们可以使用动态规划算法,自底向上进行搜索,这样,在计算后面的时候,前面的数据我们已经对其进行保存,直接进行计算即可,时间复杂度很大程度降低。
-
既然决定使用动态规划算法,首先引入一个二位数组 c[][], 记录 x[i] 与 y[j] 的LCS 的长度,b[i][j] 记录 c[i][j] 的通过哪一个子问题的值求得的,以决定搜索方向。
-
抽取状态转移方程(X=x 1 x 2 ...x m 、Y=y 1 y 2 ...y n 为两个序列,Z=z 1 z 2 ...z k 为公共子序列)