Java代码实现以下功能 给你两个字符串 str1 和 str2返回同时以 str1 和 str2 作为 子序列 的最短字符串。如果答案不止一个则可以返回满足条件的 任意一个 答案。如果从字符串 t 中删除一些字符也可能不删除可以得到字符串 s 那么 s 就是 t 的一个子序列。
public class ShortestCommonSupersequence { public static String shortestCommonSupersequence(String str1, String str2) { int m = str1.length(); int n = str2.length(); int[][] dp = new int[m+1][n+1];
// 初始化dp数组
for (int i = 0; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 0; j <= n; j++) {
dp[0][j] = j;
}
// 填充dp数组
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (str1.charAt(i-1) == str2.charAt(j-1)) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + 1;
}
}
}
// 构造最短公共超序列
StringBuilder sb = new StringBuilder();
int i = m, j = n;
while (i > 0 && j > 0) {
if (str1.charAt(i-1) == str2.charAt(j-1)) {
sb.append(str1.charAt(i-1));
i--;
j--;
} else if (dp[i-1][j] < dp[i][j-1]) {
sb.append(str1.charAt(i-1));
i--;
} else {
sb.append(str2.charAt(j-1));
j--;
}
}
while (i > 0) {
sb.append(str1.charAt(i-1));
i--;
}
while (j > 0) {
sb.append(str2.charAt(j-1));
j--;
}
return sb.reverse().toString();
}
public static void main(String[] args) {
String str1 = "AGGTAB";
String str2 = "GXTXAYB";
System.out.println(shortestCommonSupersequence(str1, str2)); // 输出 "AGGXTXAYB"
}
原文地址: https://www.cveoy.top/t/topic/gstN 著作权归作者所有。请勿转载和采集!