2021年10月13日 星期三

[LeetCode] 1092. Shortest Common Supersequence

轉自LeetCode

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"

 

Constraints:

  • 1 <= str1.length, str2.length <= 1000
  • str1 and str2 consist of lowercase English letters.

Solution


1143. Longest Common Subsequence 的衍生題

如果能找到 LCS,最後只要將沒有出現在 LCS 的字元串起來,就能找到答案

將 DP 改存 string,也就是 LCS 的值,而不是長度

這題覺得最難的地方是組答案的地方

首先,要記得一個觀念,subsequence 也是有順序的

s1 = aaab 和 s2 = aadb 的 LCS 是 aab

不論在s1和s2,一定是會先出現兩個a,才會出現b

因此,最後組答案的時候,可以用歷遍 LCS 的方式

如果和當下LCS字元不同的值的時候,就放到最後答案裡

如果和當下LCS字元相同的時候,就單純移動指標

當然,LCS 本身的字元也都要放到答案裡

最後,檢查一下 s1 和 s2 在指標後面還有沒有字串,有的話就全部加進來就好

kotlin


沒有留言:

張貼留言