[
dp
string
]
Leetcode 1092. Shortest Common Supersequence
Problem statement
https://leetcode.com/problems/shortest-common-supersequence/
Solution
The idea is to find the longest common subsequence first and then using our dp
table we can reconstruct answer: if we have str[x] == str[y]
, we reduce x
and y
by one. If we have dp(x, y) == dp(x, y-1) + 1
, we reduce y
by one. In opposite case we reduce x
by one.
Complexity
It is O(mn)
for time and space.
Code
class Solution:
def shortestCommonSupersequence(self, str1, str2):
m, n = len(str1), len(str2)
@lru_cache(None)
def dp(i, j):
if i == -1: return j + 1
if j == -1: return i + 1
if str1[i] == str2[j]:
return dp(i-1, j-1) + 1
return min(dp(i-1, j), dp(i, j-1)) + 1
x, y = m - 1, n - 1
ans = ""
while (x, y) != (-1, -1):
if x >= 0 and y >= 0 and str1[x] == str2[y]:
ans += str1[x]
x, y = x - 1, y - 1
else:
if y >= 0 and dp(x, y) == dp(x, y-1) + 1:
ans += str2[y]
y -= 1
else:
ans += str1[x]
x -= 1
return ans[::-1]