最长公共子序列长度题解
识别的题目文字
“最长公共子序列长度常常用来衡量两个序列的相似度。其定义如下:给定两个序列 \(X=x_1,x_2,\dots,x_m\) 和 \(Y=y_1,y_2,\dots,y_n\),最长公共子序列(LCS)问题的目标是找到一个最长的新序列 \(Z=z_1,z_2,\dots,z_k\),使得序列 \(Z\) 既是序列 \(X\) 的子序列,又是序列 \(Y\) 的子序列,且序列 \(Z\) 的长度 \(k\) 在满足上述条件的序列里是最大的。(注:序列 \(A\) 是序列 \(B\) 的子序列,当且仅当在保持序列 \(B\) 元素顺序的情况下,从序列 \(B\) 中删除若干个元素,可以使得剩余的元素构成序列 \(A\)。)
则序列 ABCAAAABA 和 ABABCBABA 的最长公共子序列长度为( )
A. 4 B. 5 C. 6 D. 7”
详细分析与讲解
设 \(X=\) ABCAAAABA,\(Y=\) ABABCBABA。
用经典 DP:\(dp[i][j]\) 表示 \(X[1..i]\) 与 \(Y[1..j]\) 的 LCS 长度。
- 若 \(X_i=Y_j\),则 \(dp[i][j]=dp[i-1][j-1]+1\);
- 否则 \(dp[i][j]=\max(dp[i-1][j],\,dp[i][j-1])\);
- 边界:第一行/列为 0。时间复杂度 \(O(mn)\)。
把两串按行列填表(行是 X,列是 Y)可得:
A B A B C B A B A
A | 1 1 1 1 1 1 1 1 1
B | 1 2 2 2 2 2 2 2 2
C | 1 2 2 2 3 3 3 3 3
A | 1 2 3 3 3 3 4 4 4
A | 1 2 3 3 3 3 4 4 5
A | 1 2 3 3 3 3 4 4 5
A | 1 2 3 3 3 3 4 4 5
B | 1 2 3 4 4 4 4 5 5
A | 1 2 3 4 4 4 5 5 6 ← 答案
右下角为 6,因此 LCS 长度是 6。构造出一条可行的最长公共子序列,例如
ABAABA:
- 在 \(X=\) ABCAAAABA 中可取下标 \(1,2,4,5,8,9\) → A B A A B A;
- 在 \(Y=\) ABABCBABA 中可取下标 \(1,2,3,7,8,9\) → A B A A B A。
为什么不是 7?
从字符计数上看,上界是 \(\min(A)=4\) + \(\min(B)=2\) + \(\min(C)=1\) = 7,但受顺序约束限制达不到:
\(Y\) 中的 C 位于两段 “AB…AB” 之间(…表示 C 前后严格的顺序),而 \(X\) 在 C 之后只有 一个 B,无法同时满足 C 后还要匹配两次 B 与足够的 A 的顺序需求,故无法达到 7。
正确选项:C. 6。

浙公网安备 33010602011771号