# Leetcode_1092. Shortest Common Supersequence
###### tags: `Leetcode` `Hard` `Longest Common Subsequence`
Given two strings str1 and str2, return the shortest string that has both str1 and str2 as subsequences. If there are multiple valid strings, return any of them.
A string s is a subsequence of string t if deleting some number of characters from t (possibly 0) 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.
```
```
Example 2:
Input: str1 = "aaaaaaaa", str2 = "aaaaaaaa"
Output: "aaaaaaaa"
```
``` c=
class Solution {
public:
string shortestCommonSupersequence(string str1, string str2) {
string res="";
int i=0,j=0;
for(char c:LCS(str1,str2)){
while(i<=str1.length()-1 && str1[i]!=c){
res+=str1[i++];
}
while(j<= str2.length()-1 && str2[j]!=c){
res+=str2[j++];
}
res+=c;
i++;
j++;
}
return res+str1.substr(i)+str2.substr(j);
}
private:
string LCS(string& A,string& B){
int n=A.length(); // row
int m=B.length(); // col
vector<vector<string>> dp(n+1,vector<string>(m+1,""));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(A[i]==B[j]){
dp[i+1][j+1]=dp[i][j]+A[i];
}else{
dp[i+1][j+1]=dp[i+1][j].length()>dp[i][j+1].length()?dp[i+1][j]:dp[i][j+1];
}
}
}
return dp[n][m];
}
};
```
Reference (LCS): https://web.ntnu.edu.tw/~algo/Subsequence2.html