📅  最后修改于: 2023-12-03 15:10:37.423000             🧑  作者: Mango
最长公共子序列(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语言实现最长公共子序列的程序,使用了动态规划算法来解决问题。这个程序可以应用到许多场景,例如文本编辑器的差异比较、代码版本控制等。