最长公共子序列问题
本文最后更新于:2024年3月18日 晚上
最长公共子序列问题
问题分析
- 给定两个序列 X = { x1, x2, …, xm }和 Y = { y1, y2, …, yn },找出 X 和 Y 的最长公共子序列。
算法分析
- 设序列 X = { x1, x2, …, xm }和 Y = { y1, y2, …, yn }的最长公共子序列为 Z = { z1, z2, …, zk },则。
- 若 xm = yn,则 zk = xm = yn,且 Zk-1是 Xm-1和 Yn-1的最长公共子序列。
- 若 xm != yn,且 zk != xm,则 Z 是 Xm-1和 Y 的最长公共子序列。
- 若 xm != yn,且 zk != yn,则 Z 是 X 和 Yn-1的最长公共子序列。
- 其中 Xm-1 = { x1, x2, …, xm-1 }, Yn-1 = { y1, y2, …, yn-1 }, Z = { z1, z2, …, zk-1 }
代码实现
1 |
|
LCSLength(int[] x, int[] y, int[][] c, int[][] b)
:计算最长公共子序列最优值。int x
:序列 Xint y
:序列 Yint[][] c
:c[i][j]
存储 Xi和 Yj的最长公共子序列的长度。int b[i][j]
:b[i][j]
记录 c[i][j]
的值是由哪一个子问题的解得到的,其中1
代表左上
,2
代表上
,3
代表左
LCS(m, n, x, b)
:计算最长公共子序列最优解。int m
:序列 X 的长度。int n
:序列 Y 的长度。int x
:序列 Xint b[i][j]
:b[i][j]
记录最优值是由哪一个子问题的解得到的,其中1
代表左上
,2
代表上
,3
代表左
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!