【算法】Longest Common Sequence & Dynamic Programming

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

给定两个序列【 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} LCSzk X − x i X-{x_i} Xxi Y − y j Y-{y_j} Yyj的最长公共子序列;
  • ②若 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} Xxi 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} Yyj的最长公共子序列;
  • ④将 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)其动态规划递推式以及边界条件如下所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108407535