代码随想录第56天|583. 两个字符串的删除操作、72. 编辑距离

73 阅读2分钟

583. 两个字符串的删除操作

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        # dp[i][j]表示子串word1[:i+1]和word2[:j+1]相同所需要最小步数。
        # 如果word1[i]与word2[j]相等,那么dp[i][j] = dp[i-1][j-1]
        # 如果word1[i]与word2[j]不相等,那么dp[i][j] = min(dp[i-1][j], dp[i][j-1])
        word1 = list(word1)
        word2 = list(word2)

        dp = [[0] * (len(word1) + 1) for _ in range(len(word2) + 1)]
        for i in range(1, len(word1) + 1):
            dp[0][i] = i
        for j in range(1, len(word2) + 1):
            dp[j][0] = j

        for i in range(1, len(word2) + 1):
            for j in range(1, len(word1) + 1):
                if word2[i - 1] == word1[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1]
                else:
                    dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2)
        # print(dp)
        return dp[-1][-1]

记得如果不相等有三种情况,要么都删,要么删一个,但是这也是操作,所以要计数。 另外初始化要实事求是,直觉删多少次就设置多少次。

72. 编辑距离

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        # dp[i][j]表示子串word1[:i+1]和word2[:j+1]相同所需要最小步数。
        # 如果word1[i]与word2[j]相等,那么dp[i][j] = dp[i-1][j-1]
        # 如果word1[i]与word2[j]不相等,那么dp[i][j] = min(dp[i-1][j], dp[i][j-1])
        word1 = list(word1)
        word2 = list(word2)

        dp = [[0] * (len(word1) + 1) for _ in range(len(word2) + 1)]
        for i in range(1, len(word1) + 1):
            dp[0][i] = i
        for j in range(1, len(word2) + 1):
            dp[j][0] = j

        for i in range(1, len(word2) + 1):
            for j in range(1, len(word1) + 1):
                if word2[i - 1] == word1[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
        # print(dp)
        return dp[-1][-1]

word2添加一个元素,相当于word1删除一个元素,例如 word1 = "ad" ,word2 = "a"word1删除元素'd' 和 word2添加一个元素'd',变成word1="a", word2="ad", 最终的操作数是一样! 只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。