JZX轻语:简

LeetCode 712 - 两个字符串的最小ASCII删除和

发表于2024年04月18日

#动态规划 #字符串 #编辑距离

带权重的编辑问题,其中删除一个字符的成本为字符的ASCII值。令dp[i][j]为子串s1[:i]s2[:j]的最小编辑距离:如果s1[i - 1]等于s2[j - 1],则dp[i][j] = dp[i - 1][j - 1](两字符串该字符无需修改),否则dp[i][j] = min(dp[i][j - 1] + ord(s2[j - 1]), dp[i - 1][j] + ord(s1[i - 1]))(删除s1[:i]的最后一个字符的代价 + 子串s1[:i - 1]s2[:j]的累积代价 or 删除s2[:j]的最后一个字符的代价 + 子串s1[:i]s2[:j - 1]的累积代价)。

class Solution:
    def minimumDeleteSum(self, s1: str, s2: str) -> int:
        # dp[i][j] -> s1[:i]和s2[:j]的编辑距离
        dp = [[0] * (len(s2) + 1) for _ in range((len(s1) + 1))]
        for i, ch in enumerate(s1):
            dp[i + 1][0] = dp[i][0] + ord(ch)
        for i, ch in enumerate(s2):
            dp[0][i + 1] = dp[0][i] + ord(ch)
        for i in range(1, len(s1) + 1):
            for j in range(1, len(s2) + 1):
                c1 = s1[i - 1]
                c2 = s2[j - 1]
                if c1 == c2:
                    dp[i][j] = dp[i - 1][j - 1]
                else:
                    dp[i][j] = min(
                        dp[i - 1][j] + ord(c1),
                        dp[i][j - 1] + ord(c2)
                    )
        return dp[len(s1)][len(s2)]

闪念标签:LC

题目链接:https://leetcode.cn/problems/find-original-array-from-doubled-array/