使用动态规划算法实现最长公共子序列问题,输出最长公共子序列,java
时间: 2023-11-11 22:17:25 浏览: 72
好的,我会尽力回答你的问题。
最长公共子序列问题是指在两个字符串中找到一个最长的公共子序列,即两个字符串中都存在的、长度最长的子序列。动态规划算法是解决该问题的常用方法。
下面是Java代码实现:
```java
public class LongestCommonSubsequence {
public static String findLCS(String s1, String s2) {
int[][] dp = new int[s1.length() + 1][s2.length() + 1];
// 初始化第一行和第一列
for (int i = 0; i <= s1.length(); i++) {
dp[i][0] = 0;
}
for (int j = 0; j <= s2.length(); j++) {
dp[0][j] = 0;
}
// 计算dp数组
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();
int 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 = "ABCBDAB";
String s2 = "BDCABA";
String lcs = findLCS(s1, s2);
System.out.println(lcs);
}
}
```
代码中,我们使用一个二维数组 `dp` 来存储最长公共子序列的长度。`dp[i][j]` 表示字符串 `s1` 的前 `i` 个字符和字符串 `s2` 的前 `j` 个字符中最长公共子序列的长度。然后,我们遍历整个 `dp` 数组,计算出最长公共子序列的长度。最后,我们根据 `dp` 数组构造最长公共子序列。
希望这个回答能够解决你的问题。如果你还有其他问题,可以继续问我。
阅读全文