leetcode 1092. 最短公共超序列
创始人
2025-05-31 10:20:39
0

给出两个字符串 str1 和 str2,返回同时以 str1 和 str2 作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。

(如果从字符串 T 中删除一些字符(也可能不删除,并且选出的这些字符可以位于 T 中的 任意位置),可以得到字符串 S,那么 S 就是 T 的子序列)

示例:

输入:str1 = “abac”, str2 = “cab”
输出:“cabac”
解释:
str1 = “abac” 是 “cabac” 的一个子串,因为我们可以删去 “cabac” 的第一个 "c"得到 “abac”。
str2 = “cab” 是 “cabac” 的一个子串,因为我们可以删去 “cabac” 末尾的 “ac” 得到 “cab”。
最终我们给出的答案是满足上述属性的最短字符串。

容易想到最终的方案必然是由三部分组成:两字符串的公共子序列(且必然是最长公共子序列)+ 两者特有的字符部分。可以先求最长公共子序列的dp,其中dp[i][j]为考虑s1前i个字符和s2前j个字符的最长公共子序列的长度,然后回溯法一一还原:

使用 i 变量指向 s1 的尾部m, 使用 j 变量指向 s2 的尾部n, f[i][j] 从何值转移而来:

若 i 或 j 其一走完(i = 0 或 j = 0),将剩余字符追加到答案中;
当 f[i][j]=f[i−1][j−1]+1 且 s1[i-1]=s2[j-1] 时,此时它们为 LCS 中的字符,将其追加到具体方案,并让 i 和 j 同时前移;
当 f[i][j]=f[i−1][j],s1[i-1]为特有字符,将 s1[i-1] 追加到答案中,令 i 前移;
当 f[i][j]=f[i][j-1],s2[j-1]为特有字符,将 s2[j-1] 追加到答案中,令 j 前移;
当 f[i][j]=f[i-1][j-1],s1[i-1]或s2[j-1] 随便一个追加到答案中,令i j同时前移;

最后,由于我们是从后往前进行构造,在返回时需要再进行一次翻转。

时间复杂度空间复杂度都是O(mn)

class Solution:def shortestCommonSupersequence(self, str1: str, str2: str) -> str:m = len(str1)n = len(str2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(1, m+1):for j in range(1, n+1):if str1[i-1] == str2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])res = ''i = mj = n while (i > 0) and (j > 0):if (dp[i][j] == dp[i-1][j-1] + 1) and (str1[i-1] == str2[j-1]):res += str1[i-1]i -= 1j -= 1elif dp[i][j] == dp[i-1][j]:res += str1[i-1]i -= 1elif dp[i][j] == dp[i][j-1]:res += str2[j-1]j -= 1elif dp[i][j] == dp[i-1][j-1]:res += str1[i-1]i -= 1 j -=1 if i == 0:res += str2[:j][::-1]if j == 0:res += str1[:i][::-1]return res[::-1]

相关内容

热门资讯

甜城麻将安卓系统,解锁全新麻将... 你有没有听说过那个超级火的甜城麻将安卓系统?没错,就是那个让无数麻将爱好者为之疯狂的软件!今天,就让...
安卓系统卸载的软件,深度揭秘卸... 手机里的软件越来越多,是不是感觉内存不够用了?别急,今天就来教你怎么在安卓系统里卸载那些不再需要的软...
安卓系统推荐好游戏,畅享指尖乐... 手机里的游戏可是咱们休闲娱乐的好伙伴,尤其是安卓系统的用户,选择面那可是相当广呢!今天,就让我来给你...
王者安卓系统怎么卖,揭秘如何轻... 你有没有听说最近王者安卓系统的火爆程度?没错,就是那个让无数玩家沉迷其中的王者荣耀!今天,我就来给你...
安卓开发系统内置证书,基于安卓... 你有没有想过,你的安卓手机里那些神秘的内置证书,它们到底是个啥玩意儿?别急,今天就来给你揭秘这些隐藏...
荣耀安装安卓原生系统,深度体验... 你知道吗?最近荣耀手机界可是掀起了一股热潮,那就是——荣耀安装安卓原生系统!这可不是什么小打小闹,而...
安卓13小米系统,创新功能与流... 你知道吗?最近安卓13系统可谓是风头无两,各大手机厂商纷纷推出自家的新版系统,其中小米的安卓13系统...
鸿蒙系统底层安卓10,融合与创... 你知道吗?最近手机圈里可是热闹非凡呢!华为的新操作系统鸿蒙系统,竟然在底层采用了安卓10的架构。这可...
安卓系统辅助在哪关闭,轻松关闭... 你有没有发现,安卓系统的辅助功能真是贴心到不行啊!不过,有时候这些功能太多,用起来有点乱糟糟的。别急...
安卓系统outlook邮件设置... 你有没有发现,自从你把手机升级到了安卓系统,邮件管理变得有点复杂呢?别急,今天就来手把手教你如何设置...
安卓系统停止向华为,自主操作系... 你知道吗?最近科技圈可是炸开了锅!安卓系统突然宣布停止向华为提供技术支持,这可不仅仅是两家公司之间的...
安卓系统连接被重置,原因解析与... 最近你的安卓手机是不是有点儿闹脾气呢?连接被重置的问题让你头疼不已?别急,今天就来给你详细解析一下这...
安卓系统自占内存,揭秘内存占用... 你有没有发现,你的安卓手机越来越慢了?是不是觉得内存不够用,打开个应用都卡得要命?别急,今天就来跟你...
安卓系统怎么转windows,... 你是不是也和我一样,手里拿着一台安卓手机,心里却想着换一台Windows系统的电脑呢?别急,今天就来...
安卓系统相册软件下载,下载与使... 手机里的相册是不是已经满满当当,想要给它们找个新家?别急,今天就来给你安利几款超好用的安卓系统相册软...
安卓9系统优化软件,解锁流畅体... 你有没有发现,自从你的安卓手机升级到了安卓9系统,运行速度好像变得更快了?是不是觉得手机变得更加流畅...
各厂商安卓系统对比,性能、特色... 你有没有发现,现在手机市场上安卓系统的竞争可是相当激烈呢!各大厂商纷纷推出自己的特色系统,让人眼花缭...
车机进入安卓系统,智能驾驶体验... 你有没有发现,最近你的车机系统好像变得不一样了?没错,车机系统正在悄悄地进入安卓的大家庭!这可不是什...
安卓系统自带壁纸高清,自带高清... 亲爱的手机控们,你是否曾为安卓系统自带的那些高清壁纸而驻足欣赏?那些色彩斑斓、风格迥异的画面,是不是...
安卓机换成钟表系统,探索智能穿... 你有没有想过,你的安卓手机其实也可以换上钟表系统呢?是的,你没听错,就是那种优雅、简洁、充满艺术感的...