最长公共子序列长度题解

识别的题目文字

“最长公共子序列长度常常用来衡量两个序列的相似度。其定义如下:给定两个序列 \(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\)。)
则序列 ABCAAAABAABABCBABA 的最长公共子序列长度为( )
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

posted @ 2025-08-29 12:32  kkman2000  阅读(26)  评论(0)    收藏  举报