📜  最长公共子序列的Java程序(1)

📅  最后修改于: 2023-12-03 15:40:17.015000             🧑  作者: Mango

最长公共子序列的Java程序

简介

最长公共子序列(LCS)问题是指在两个序列中找到一个最长的公共子序列的问题。该问题在计算机科学和生物信息学中具有广泛的应用。本文将介绍如何用Java编写求解最长公共子序列的程序。

思路

求解最长公共子序列问题通常采用动态规划的方法。设两个序列分别为s1和s2,LCS[i][j]表示s1前i个字符和s2前j个字符的最长公共子序列长度。可以得到如下递推式:

  • 当s1[i] = s2[j]时,LCS[i][j] = LCS[i-1][j-1]+1
  • 当s1[i] != s2[j]时,LCS[i][j] = max(LCS[i-1][j], LCS[i][j-1])
代码实现
public static String lcs(String s1, String s2) {
    int l1 = s1.length(), l2 = s2.length();
    int[][] dp = new int[l1+1][l2+1];
    for (int i = 1; i <= l1; i++) {
        for (int j = 1; j <= l2; j++) {
            if (s1.charAt(i-1) == s2.charAt(j-1)) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
            }
        }
    }
    StringBuilder sb = new StringBuilder();
    int i = l1, j = l2;
    while (i > 0 && j > 0) {
        if (s1.charAt(i-1) == s2.charAt(j-1)) {
            sb.append(s1.charAt(i-1));
            i--;
            j--;
        } else if (dp[i-1][j] >= dp[i][j-1]) {
            i--;
        } else {
            j--;
        }
    }
    return sb.reverse().toString();
}
示例
String s1 = "ABCDGH";
String s2 = "AEDFHR";
String lcs = lcs(s1, s2);
System.out.println(lcs);
// 输出结果:ADH
总结

通过动态规划的方法,我们可以方便地求解最长公共子序列问题。这个问题虽然简单,但却具有广泛的应用场景,因此掌握这个问题的求解方法对于程序员来说是必不可少的。