Leetcode 583

看到这题我就想到了72,编辑距离那题真的是脑汁噩梦……

 

回到这题上来,这题只是要求删除字符,那么必然是要求出两个单词之间的最长公共子序列。这个子序列越长,那么需要删除的字符就越少。

 

那么显然这题就是要用动态规划了。比较两个字符的时候,分两种情况,字符一样和字符不一样

dp[i][j]=

word[i] == word[j], 那么就大家各进一步,1+dp[i+1][j+1]

word[i] != word[j],那么挑选一个丢掉,max(dp[i][j+1], dp[i+1][j])

最后考虑边界条件,i == len(word1) 或者 j == len(word2) 的时候,返回 0

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        maxi = len(word1)
        maxj = len(word2)
        dp = [[0] * (maxj + 1) for _ in range(maxi + 1)]
        for i in range(maxi + 1):
            dp[i][maxj] = 0
        for j in range(maxj + 1):
            dp[maxi][j] = 0
        for i in range(maxi - 1, -1, -1):
            for j in range(maxj - 1, -1, -1):
                if word1[i] == word2[j]:
                    dp[i][j] = 1 + dp[i + 1][j + 1]
                else:
                    dp[i][j] = max(dp[i + 1][j], dp[i][j+1])
        return maxi + maxj - 2 * dp[0][0]

 

posted on 2021-09-25 09:59  Ricochet!  阅读(26)  评论(0编辑  收藏  举报