编辑距离 (leetcode72)

一:解题思路

这是一道动态规划的难题,即一个规模较大的问题可以分解为一个个规模较小的问题,并且规模较小的问题和规模较大的问题解法是一样的。

Time:O(m*n),Space:O(m*n)

二:完整代码示例 (C++版和Java版)

C++:

class Solution 
{
private:
    int min3(int a, int b, int c)
    {
        return min(a,min(b,c));
    }
public:
    int minDistance(string word1, string word2) 
    {
        if (word1.size() == 0 && word2.size() == 0) return 0;
        int m = word1.size() + 1;
        int n = word2.size() + 1;
        vector<vector<int>> d(m,vector<int>(n,0));

        for (int j = 0; j < n; j++)
            d[0][j] = j;
        for (int i = 0; i < m; i++)
            d[i][0] = i;

        for (int i = 1; i < m; i++)
        {
            for (int j = 1; j < n; j++)
            {
                if (word1[i - 1] == word2[j - 1]) d[i][j] = d[i-1][j-1];
                else d[i][j] = min3(d[i-1][j-1],d[i-1][j],d[i][j-1]) + 1;
            }
        }

        return d[m-1][n-1];
    }
};

Java:

class Solution 
    {
        private int min(int a,int b,int c)
        {
            return Math.min(a,Math.min(b,c));
        }
        
        public int minDistance(String word1, String word2) 
        {
               if(word1==null || word2==null) return 0;
               int m=word1.length()+1;
               int n=word2.length()+1;
               int[][] d=new int[m][n];
               
               for(int j=0;j<n;j++)
                   d[0][j]=j;
               for(int i=0;i<m;i++)
                   d[i][0]=i;
               
               for(int i=1;i<m;i++)
               {
                   for(int j=1;j<n;j++)
                   {
                       if(word1.charAt(i-1)==word2.charAt(j-1)) d[i][j]=d[i-1][j-1];
                       else d[i][j]=min(d[i-1][j-1],d[i-1][j],d[i][j-1])+1;
                       
                   }
               }
               
               return d[m-1][n-1];
        }
    }

 

Python方法一:

class Solution:
    def min3(self,a:int,b:int,c:int):
        
        return min(a,min(b,c))
    
    def minDistance(self, word1: str, word2: str) -> int:
        m=len(word1)+1
        n=len(word2)+1
        
        d=[n*[0] for i in range(m)]
        
        for i in range(m):
            d[i][0]=i
        for j in range(n):
            d[0][j]=j
        
        for i in range(1,m):
            for j in range(1,n):
                if word1[i-1]==word2[j-1]:
                    d[i][j]=d[i-1][j-1]
                else:
                    d[i][j]=self.min3(d[i-1][j-1],d[i-1][j],d[i][j-1])+1
        
        
        
        return d[m-1][n-1]
posted @ 2020-07-31 12:14  repinkply  阅读(162)  评论(0)    收藏  举报