-
题目链接 https://leetcode-cn.com/problems/minimum-ascii-delete-sum-for-two-strings/
-
题目描述
- 给定两个字符串
s1, s2
,找到使两个字符串相等所需删除字符的ASCII值的最小和。 -
示例 1:
输入: s1 = "sea", s2 = "eat" 输出: 231 解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。 在 "eat" 中删除 "t" 并将 116 加入总和。 结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。
示例 2:
输入: s1 = "delete", s2 = "leet" 输出: 403 解释: 在 "delete" 中删除 "dee" 字符串变成 "let", 将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。 结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。 如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。
- 给定两个字符串
-
解题思路
- 通过观察能够看出当s1[0] 等于 s2[0]时,s1 和s2的最小删除和是 s1[1:]和s2[1:]的最小删除和,否则就是s1,s2[1:]的最小删除加上s2[0] 和 s2,s1[1:]的最小删除加上s1[0] 的最小值。因此我们就有了如下递归式
- 根据上述式子,可以采用动态规划解决此问题。上式t同样也是状态转移方程。状态空间为l 是一个len(s1) * len(s2)的矩阵,但操作时发现,当前状态dp[i][j]只从dp[i-1][j],dp[i][j-1]以及dp[i-1][j-1]三个状态中转化,因此只需维护一个一维的状态数组以及dp[i-1][j-1]即可
- 通过观察能够看出当s1[0] 等于 s2[0]时,s1 和s2的最小删除和是 s1[1:]和s2[1:]的最小删除和,否则就是s1,s2[1:]的最小删除加上s2[0] 和 s2,s1[1:]的最小删除加上s1[0] 的最小值。因此我们就有了如下递归式
-
代码
- python
class Solution: def minimumDeleteSum(self, s1: str, s2: str) -> int: dp = [0] for s in s2: dp.append(ord(s) + dp[-1]) for s in s1: equal = dp[0] dp[0] += ord(s) for i in range(1, len(s2) + 1): if s == s2[i - 1]: dp[i], equal = equal, dp[i] else: equal, dp[i] = dp[i], min(dp[i - 1] + ord(s2[i - 1]), dp[i] + ord(s)) return dp[-1]
- python
leetcode 712. 两个字符串的最小ASCII删除和
最新推荐文章于 2024-08-10 11:04:54 发布