📅  最后修改于: 2023-12-03 15:26:26.741000             🧑  作者: Mango
给定两个字符串 s 和 t, 设计算法以找到最小的删除操作数,使得从 s 中删除这些字符后,可以得到字符串 t。
我们可以使用动态规划来解决这个问题。
我们定义 dp[i][j] 为 s[0:i-1] 和 t[0:j-1] 之间的最小删除操作数。
如果 s[i-1] == t[j-1],则 dp[i][j] = dp[i-1][j-1],因为不需要删除任何字符。
否则,dp[i][j] 可以从以下三个操作中选择一个:
最终答案为 dp[m][n],其中 m 和 n 分别是字符串 s 和 t 的长度。
代码如下:
def min_delete(s: str, t: str) -> int:
m, n = len(s), len(t)
dp = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
dp[i][0] = i
for j in range(1, n+1):
dp[0][j] = j
for i in range(1, m+1):
for j in range(1, n+1):
if s[i-1] == t[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
return dp[m][n]
时间复杂度为 O(mn),空间复杂度为 O(mn)。
输入: s = "sea", t = "eat" 输出: 2 解释: 可以删除 s 中的 's' 和 'a',使得 s 变为 "e",然后删除 'e',使得 s 和 t 相等。
输入: s = "leetcode", t = "etco" 输出: 4 解释: 可以删除 s 中的 'l'、'e'、'e' 和 'd',使得 s 变为 "tco",然后删除 't'、'c' 和 'o',使得 s 和 t 相等。