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.
Solution: (Find the longest common subsequence)
classSolution{public:stringfindLCS(string&s1,string&s2) {int n =s1.length();int m =s2.length();if (n ==0|| m ==0) {return""; } vector<vector<string>>dp(n +1,vector<string>(m +1,""));for (int i =1; i <= n; i++) {for (int j =1; j <= m; j++) {if (s1[i -1] ==s2[j -1]) {dp[i][j] =dp[i -1][j -1] +s1[i -1]; }else { string exci =dp[i -1][j]; string excj =dp[i][j -1];dp[i][j] = (exci.length()>excj.length()) ? exci : excj; } } }returndp[n][m]; }stringshortestCommonSupersequence(string&str1,string&str2) { string lcs =findLCS(str1, str2);int k =0;int i =0, j =0; string res ="";while (k <lcs.length()) {while (str1[i] !=lcs[k]) { res +=str1[i]; i++; }while (str2[j] !=lcs[k]) { res +=str2[j]; j++; } res +=lcs[k]; i++; j++; k++; } res +=str1.substr(i); res +=str2.substr(j);return res; }};