给定两个字符串,可以有插入、替换和删除操作,求最小的操作次数使得两个字符串相等,原题如下
【leetcode】72. Edit Distance解题报告典型的Dp问题,DP核心是求递推方程,递推方程求出来,问题也就解决了,DP问题的递推方程都是建立在上一步的基础上的,也就是说在上一步满足条件的情况下求这一步该怎么做,以本地为例,我们用p[i-1][j-1]表示word1[0:i-1]word2[0:j-1]通过上述三种操作达到相同状态所需要的最小步数,那么我们该如何求dp[i][j]呢?

如果word1[i] == word[j-1]那么不需要进行操作
dp[i][j] = dp[i-1][j-1]

如果word1[i]!=word[j],则可以通过删除或者插入操作使两个字符串相等
通过删操作
word1[i-1]已经和word2[j]达到相同的情况下,我们删除word[i]即可
dp[i][j] = dp[i-1][j] +1
或者
word1[i] 已经和word2[j-1]达到相同的情况下,我们删除word[j]即可
dp[i][j] =dp[i-1][j-1]+1
其实插入删除互相为逆操作,删除能达到的效果那么反过来通过插入对方也能达到相同的状态
AC代码

class Solution:
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        dp = [[0 for i in range(len(word1)+1)] for j in range(len(word2)+1)]

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

AC的时间有点长,应该可以再优化一下

相关文章: