Java中的最长公共子序列

2025年5月6日 | 阅读4分钟

所有给定序列的最长公共子序列被称为最长公共子序列。使用LCS的原因是为了限制子序列的元素在原始序列中占据连续的位置。

一个以相同相对顺序出现的序列,无论是连续还是非连续的,都称为子序列。

例如,如果我们有两个序列,如“KTEURFJS”和“TKWIDEUJ”,那么最长公共子序列将是“TEUJ”,长度为4。

Java中,有两种方法可以实现LSC程序,即使用递归方法和使用动态规划。这两种方法都有不同的实现方式。

Longest Common Subsequence in Java

使用动态规划

这种方法是一种表格化的最长公共子序列实现。为了找到最长公共子序列,我们使用以下步骤

  1. 首先,我们创建一个尺寸为 (p + 1)*(q + 1) 的表格,其中 p 和 q 是给定序列的长度。在创建的表格中,我们将第一行和第一列设置为0。
  2. 表格的所有剩余单元格都通过使用以下步骤填充
    1. 如果相应行和列的字符相同并且成功匹配,则用1填充当前单元格到对角线元素,并将一个箭头指向对角线单元格。
    2. 如果字符不匹配,我们用前一列和前一行元素的值填充当前单元格。箭头指向具有最大值的单元格,当两个单元格的值相等时,箭头将指向其中任何一个。
    3. 我们重复步骤2,直到整个表格被填充完毕。
    4. 最长公共子序列的长度是最后一行和最后一列的值。
    5. 为了获得LCS,我们遵循从最后一个元素开始的箭头方向。对应于括号()的元素构成了最长公共子序列。

让我们通过遵循上述步骤,使用动态规划来实现最长公共子序列的代码。

LCSExample1.java

输出

Longest Common Subsequence in Java

使用递归实现

让我们通过一个使用递归实现的LCS的例子来理解。在这个例子中,我们从用户那里获取两个序列,并返回或打印最长公共子序列的长度。

LCSExample2.java

输出

Longest Common Subsequence in Java