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

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

最长公共子序列的Java程序

介绍

最长公共子序列(LCS,Longest Common Subsequence)是指两个字符串中公共子序列的最长长度。最长公共子序列不要求子序列在原串中是连续的。它在很多应用中都有作用,比如DNA序列的匹配、版本控制等。

本文将介绍使用Java语言实现最长公共子序列的程序。

算法

使用动态规划算法(Dynamic Programming)可以有效地解决最长公共子序列问题。

动态规划算法的基本思想是将原问题划分为若干个子问题,先求解子问题,然后由子问题的解推导出原问题的解。

应用到最长公共子序列问题中,可以构建一个二维的数组dp[][],其中dp[i][j]表示字符串s1前i个字符和字符串s2前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]);
}
代码

以下是最长公共子序列的Java程序:

public static String lcs(String s1, String s2) {
    if(s1 == null || s2 == null || s1.equals("") || s2.equals("")) {
        return "";
    }
    int[][] dp = new int[s1.length()+1][s2.length()+1];
    for(int i = 1; i <= s1.length(); i++) {
        for(int j = 1; j <= s2.length(); 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 = s1.length(), j = s2.length();
    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();
}
测试

使用以下代码进行测试:

public static void main(String[] args) {
    String s1 = "abcdefg";
    String s2 = "bcdefgh";
    String lcs = lcs(s1, s2);
    System.out.println(lcs);
}

输出结果:bcdefg

结论

本文介绍了使用Java语言实现最长公共子序列的程序,使用了动态规划算法来解决问题。这个程序可以应用到许多场景,例如文本编辑器的差异比较、代码版本控制等。