📅  最后修改于: 2023-12-03 15:40:17.015000             🧑  作者: Mango
最长公共子序列(LCS)问题是指在两个序列中找到一个最长的公共子序列的问题。该问题在计算机科学和生物信息学中具有广泛的应用。本文将介绍如何用Java编写求解最长公共子序列的程序。
求解最长公共子序列问题通常采用动态规划的方法。设两个序列分别为s1和s2,LCS[i][j]表示s1前i个字符和s2前j个字符的最长公共子序列长度。可以得到如下递推式:
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
通过动态规划的方法,我们可以方便地求解最长公共子序列问题。这个问题虽然简单,但却具有广泛的应用场景,因此掌握这个问题的求解方法对于程序员来说是必不可少的。