获取两个序列的最长公有子序列和它的最长公有子序列长度,通过追踪矩阵获取找到最长公有子序列位置并输出,使用java语言编写
时间: 2023-06-24 21:07:49 浏览: 76
可以使用动态规划来解决这个问题。
首先,定义一个二维数组dp,其中dp[i][j]表示序列1中前i个字符和序列2中前j个字符的最长公共子序列长度。
然后,根据以下递推式来填充dp数组:
- 如果序列1的第i个字符和序列2的第j个字符相等,则dp[i][j] = dp[i-1][j-1] + 1;
- 如果序列1的第i个字符和序列2的第j个字符不相等,则dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
最终,dp[m][n]就是序列1和序列2的最长公共子序列长度,其中m和n分别是序列1和序列2的长度。
接下来,可以通过追踪矩阵来获取最长公共子序列的具体内容。定义一个字符数组result,初始为空。从dp[m][n]开始,向左上方遍历dp数组,如果dp[i][j]等于dp[i-1][j-1] + 1,则说明序列1的第i个字符和序列2的第j个字符是公共子序列中的一个字符,将它加入result数组中,并将i和j都减1。如果dp[i][j]等于dp[i-1][j],则说明公共子序列中不包含序列1的第i个字符,将i减1;如果dp[i][j]等于dp[i][j-1],则说明公共子序列中不包含序列2的第j个字符,将j减1。重复这个过程直到i或j减为0。
下面是Java代码实现:
```
public class LCS {
public static void main(String[] args) {
String s1 = "ABCBDAB";
String s2 = "BDCABA";
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]);
}
}
}
int length = dp[s1.length()][s2.length()];
System.out.println("最长公共子序列长度为:" + length);
char[] result = new char[length];
int i = s1.length();
int j = s2.length();
while (i > 0 && j > 0) {
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
result[--length] = s1.charAt(i - 1);
i--;
j--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
System.out.println("最长公共子序列为:" + new String(result));
}
}
```
阅读全文