【算法】Longest Common Sequence & Dynamic Programming

tech2026-08-20  48

最长公共子序列问题描述.

给定两个序列【 X = x 1 , x 2 , x 3 , … , x i X={x_1,x_2,x_3,…,x_i} X=x1​,x2​,x3​,…,xi​】和【 Y = y 1 , y 2 , y 3 , … , y j Y={y_1,y_2,y_3,…,y_j} Y=y1​,y2​,y3​,…,yj​】,设计一个动态规划算法找出 X X X和 Y Y Y的一个最长的公共子序列。

问题分析.

最长公共子序列(Longest Common Sequence)中“子序列”就是 将给定序列中零个或多个元素去掉之后得到的结果,例如“abcdefg”的子序列 可以是“acfg”,这个概念和“子串”不同,子串必须是原字符串的连续字符组 成的序列。给定两个序列【 X = x 1 , x 2 , x 3 , … , x i X={x_1,x_2,x_3,…,x_i} X=x1​,x2​,x3​,…,xi​】、【 Y = y 1 , y 2 , y 3 , … , y j Y={y_1,y_2,y_3,…,y_j} Y=y1​,y2​,y3​,…,yj​】,设两序列 的最长公共子序列 【 L C S = z 1 , z 2 , z 3 , … , z k LCS={z_1,z_2,z_3,…,z_k} LCS=z1​,z2​,z3​,…,zk​】。 考察序列 X X X和 Y Y Y的最末尾字符,即 x i x_i xi​和 y j y_j yj​。

①若 x i x_i xi​= y j y_j yj​,则 z k z_k zk​ = x i x_i xi​ = y j y_j yj​,并且意味着 L C S − z k LCS-{z_k} LCS−zk​是 X − x i X-{x_i} X−xi​和 Y − y j Y-{y_j} Y−yj​的最长公共子序列;②若 x i x_i xi​ ≠ y j y_j yj​,并且 z k z_k zk​ ≠ x i x_i xi​,则意味着 L C S LCS LCS是 X − x i X-{x_i} X−xi​和 Y Y Y的最长公共子序列;③若 x i x_i xi​ ≠ y j y_j yj​,并且 z k z_k zk​ ≠ y j y_j yj​,则意味着 L C S LCS LCS是 X X X和 Y − y j Y-{y_j} Y−yj​的最长公共子序列;④将 m a x ( ② , ③ ) max(②,③) max(②,③)作为最长公共子序列,继续求解。

举例说明,如 X = 1 , 3 , 4 , 5 , 6 , 7 , 7 , 8 X={1,3,4,5,6,7,7,8} X=1,3,4,5,6,7,7,8、 Y = 3 , 5 , 7 , 4 , 8 , 6 , 7 , 8 , 2 Y={3,5,7,4,8,6,7,8,2} Y=3,5,7,4,8,6,7,8,2 X [ 8 ] ≠ Y [ 9 ] X[8]≠Y[9] X[8]​=Y[9], 所以 L C S ( 8 , 9 ) = m a x ( L C S ( 7 , 9 ) , L C S ( 8 , 8 ) ) LCS(8,9)=max(LCS(7,9),LCS(8,8)) LCS(8,9)=max(LCS(7,9),LCS(8,8))。 最长公共子序列的长度记为 L e n ( i , j ) Len(i,j) Len(i,j),对于 L e n ( i , j ) Len(i,j) Len(i,j)其动态规划递推式以及边界条件如下所示:

最新回复(0)