LeetCode 72 Edit Distance

来源:互联网 发布:源码建网站 编辑:程序博客网 时间:2024/05/21 04:00

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

思路:从两个词的第m,n往前开始比较,刚开始,就是从词尾开始往前逐个字符比较。使用动态数组dp[m][n]记录word1.subString(0,m)和word2.subString(0,n)的minDistance。

删除操作:如果word1进行了删除操作,则递归调用minDist(w1,w2,dp,m-1,n),因为word1删除了1位,所以要前进一位,因此m-1,而n不变。反之word2进行删除操作的话,递归调用minDist(w1,w2,dp,m,n-1).

更新操作:如果word1.subString(0,m)在词尾进行了更新操作,则更新完之后就和word2的词尾相同了,word1和word2都前进一位继续比较,递归调用minDist(w1,w2,dp,m-1,n-1)。更新word2.subString(0,n)的词尾亦然。

插入操作:如果word1.subString(0,m)在词尾进行了插入操作,则插入之后就和word2的词尾相同了,word1因为后面插入了一个字符,因此无需前进,word2前进一位,二者再继续比较,递归调用minDist(w1,w2,dp,m,n-1)。更新word2.subString(0,n)的词尾亦然。反之word2后面若插入一个字符,则递归调用minDist(w1,w2,dp,m-1,n)。

Runtime: 7 ms  runtime beats 99.10% of java submissions

public int minDistance(String word1, String word2) {if (word1 == null || word1.length() == 0) return word2.length();char[] w1 = word1.toCharArray(), w2 = word2.toCharArray();int dp[][] = new int[word1.length() + 1][word2.length() + 1];return minDist(w1, w2, dp, word1.length(), word2.length());}public int minDist(char[] w1, char[] w2, int[][] dp, int m, int n) {if (m == 0) return n;if (n == 0) return m;if (dp[m][n] != 0) return dp[m][n];if (w1[m - 1] == w2[n - 1]) return dp[m][n] = minDist(w1, w2, dp, m - 1, n - 1);return dp[m][n] = 1 + Math.min(minDist(w1, w2, dp, m, n - 1), Math.min(minDist(w1, w2, dp, m - 1, n), minDist(w1, w2, dp, m - 1, n - 1)));}

算法自https://discuss.leetcode.com/topic/49414/simple-7-ms-java-solution

0 0
原创粉丝点击