开门见山
看见这道题,我的第一反应不是去找出符合这道题的动态规划递推公式,我反而认为可以借用一下1143. 最长公共子序列的题解
class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp = new int[text1.length() + 1][text2.length() + 1];for (int i = 1 ; i <= text1.length() ; i++) {char char1 = text1.charAt(i - 1);for(int j = 1; j <= text2.length(); j++){char char2 = text2.charAt(j - 1);if(char1 == char2){dp[i][j] = dp[i - 1][j - 1] + 1;}else{dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[text1.length()][text2.length()];}
}
将上面最后一行代码改成如下:
int len = dp[word1.length()][word2.length()];return word1.length() + word2.length() - 2 * len;
求出最长公共序列之后就可以用俩字符串长度相加再减去2倍的len
用了6ms
原题解用了13ms
顺便附上原题解代码
class Solution {public int minDistance(String word1, String word2) {int[][] dp = new int[word1.length() + 1][word2.length() + 1];for (int i = 0; i < word1.length() + 1; i++) dp[i][0] = i;for (int j = 0; j < word2.length() + 1; j++) dp[0][j] = j;for (int i = 1; i < word1.length() + 1; i++) {for (int j = 1; j < word2.length() + 1; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];}else{dp[i][j] = Math.min(dp[i - 1][j - 1] + 2,Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));}}}return dp[word1.length()][word2.length()];}
}
太难理解了2333,投机取巧算了