【DP】这道题是1143. 最长公共子序列和剑指 Offer II 095. 最长公共子序列的加强版。
class Solution {
public String shortestCommonSupersequence(String str1, String str2) {
int m = str1.length(), n = str2.length();
int[][]dp = new int[m + 1][n + 1];
String[][] strs = new String[m + 1][n + 1];
for (int i = 0; i < m; i++) strs[i][0] = "";
for (int i = 0; i < n; i++) strs[0][i] = "";
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;
strs[i][j] = strs[i - 1][j - 1] + str1.charAt(i - 1);
}
else {
if (dp[i - 1][j] > dp[i][j - 1]) {
strs[i][j] = strs[i - 1][j];
} else {
strs[i][j] = strs[i][j - 1];
}
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
String common = strs[m][n];
StringBuilder sb = new StringBuilder();
int i = 0, j = 0, k = 0, l = common.length();
while (i < m && j < n) {
if (k == l) break;
char c = common.charAt(k);
if (str1.charAt(i) == c && str2.charAt(j) == c) {
sb.append(common.charAt(k++));
i++; j++;
continue;
}
if (str1.charAt(i) != c) {
sb.append(str1.charAt(i++));
}
if (str2.charAt(j) != c) {
sb.append(str2.charAt(j++));
}
}
while (i < m) sb.append(str1.charAt(i++));
while (j < n) sb.append(str2.charAt(j++));
return sb.toString();
}
}