编辑距离 (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]

浙公网安备 33010602011771号