Given two strings str1 and str2, return the shortest string that has both str1 and str2 as subsequences. If multiple answers exist, you may return any of them.
(A string S is a subsequence of string T if deleting some number of characters from T (possibly 0, and the characters are chosen anywhere from T) results in the string S.)
Example 1:
Input: str1 = "abac", str2 = "cab"
Output: "cabac"
Explanation:
str1 = "abac" is a subsequence of "cabac" because we can delete the first "c".
str2 = "cab" is a subsequence of "cabac" because we can delete the last "ac".
The answer provided is the shortest such string that satisfies these properties.
Note:
1 <= str1.length, str2.length <= 1000
str1 and str2 consist of lowercase English letters.
classSolution {publicStringshortestCommonSupersequence(String str1,String str2) {int m =str1.length();int n =str2.length();int[][] dp =newint[m +1][n +1];for (int i =0; i <= m; i++) {for (int j =0; j <= n; j++) {if (i ==0) dp[i][j] = j;elseif (j ==0) dp[i][j] = i;elseif (str1.charAt(i -1) ==str2.charAt(j -1)) dp[i][j] =1+ dp[i -1][j -1];else dp[i][j] =1+Math.min(dp[i -1][j], dp[i][j -1]); } }int l = dp[m][n]; // Length of the ShortestSuperSequencechar[] arr =newchar[l];int i = m, j = n;while (i >0&& j >0) {/* * If current character in str1 and str2 are same, then current character is * part of shortest supersequence */if (str1.charAt(i -1) ==str2.charAt(j -1)) { arr[--l] =str1.charAt(i -1); i--; j--; } elseif (dp[i -1][j] < dp[i][j -1]) { arr[--l] =str1.charAt(i -1); i--; } else { arr[--l] =str2.charAt(j -1); j--; } }while (i >0) { arr[--l] =str1.charAt(i -1); i--; }while (j >0) { arr[--l] =str2.charAt(j -1); j--; }returnnewString(arr); }}