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

给定两个序列【X=x1,x2,x3,,xiX={x_1,x_2,x_3,…,x_i}】和【Y=y1,y2,y3,,yjY={y_1,y_2,y_3,…,y_j}】,设计一个动态规划算法找出XXYY的一个最长的公共子序列。

问题分析.

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

  • ①若 xix_iyjy_j,则 zkz_k = xix_i = yjy_j,并且意味着 LCSzkLCS-{z_k}XxiX-{x_i}YyjY-{y_j}的最长公共子序列;
  • ②若 xix_iyjy_j,并且 zkz_kxix_i,则意味着LCSLCSXxiX-{x_i}YY的最长公共子序列;
  • ③若 xix_iyjy_j,并且 zkz_kyjy_j,则意味着LCSLCSXXYyjY-{y_j}的最长公共子序列;
  • ④将 max()max(②,③)作为最长公共子序列,继续求解。

举例说明,如X=1,3,4,5,6,7,7,8X={1,3,4,5,6,7,7,8}Y=3,5,7,4,8,6,7,8,2Y={3,5,7,4,8,6,7,8,2}
X[8]Y[9]X[8]≠Y[9], 所以LCS(8,9)=max(LCS(7,9),LCS(8,8))LCS(8,9)=max(LCS(7,9),LCS(8,8))
最长公共子序列的长度记为Len(i,j)Len(i,j),对于Len(i,j)Len(i,j)其动态规划递推式以及边界条件如下所示:
【算法】Longest Common Sequence & Dynamic Programming

相关文章:

  • 2021-08-27
  • 2021-06-15
  • 2021-12-27
  • 2021-12-05
  • 2021-06-08
  • 2022-02-11
猜你喜欢
  • 2021-10-24
  • 2021-09-17
  • 2021-12-13
  • 2021-10-02
  • 2021-09-03
  • 2021-11-26
相关资源
相似解决方案