583. 两个字符串的删除操作 - 力扣(LeetCode)
也可以求最长公共子序列的长度,再用原总长度 - 两个子序列
- class Solution {
- public int minDistance(String word1, String word2) {
- int l1 = word1.length();
- int l2 = word2.length();
- int[][] dp = new int[l1+1][l2+1];
-
- for(int i = 0; i < l1 + 1; i++) // word2为空时,word1需要删除的次数
- dp[i][0] = i;
- for(int j = 0; j < l2 + 1; j++) // word1为空时,word2需要删除的次数
- dp[0][j] = j;
-
- for(int i = 1; i <= l1; i++){
- for(int j = 1; j <= l2; j++){
- if(word1.charAt(i-1) == word2.charAt(j-1))
- dp[i][j] = dp[i-1][j-1];
- else // 删word1, 删word2,两个都删
- dp[i][j] = Math.min(Math.min(dp[i][j-1] + 1, dp[i-1][j] + 1), dp[i-1][j-1] + 2);
- }
- }
-
- return dp[l1][l2];
- }
- }
增加元素 = 在另一边删除元素 (操作次数一样)
修改元素 = 两边相等的情况
- class Solution {
- public int minDistance(String word1, String word2) {
- int l1 = word1.length();
- int l2 = word2.length();
- int[][] dp = new int[l1+1][l2+1];
-
- for(int i = 0; i < l1 + 1; i++) // word2为空时,word1需要删除的次数
- dp[i][0] = i;
- for(int j = 0; j < l2 + 1; j++) // word1为空时,word2需要删除的次数
- dp[0][j] = j;
-
- for(int i = 1; i <= l1; i++){
- for(int j = 1; j <= l2; j++){
- if(word1.charAt(i-1) == word2.charAt(j-1))
- dp[i][j] = dp[i-1][j-1];
- else
- dp[i][j] =
- Math.min(Math.min(dp[i][j-1]+1, dp[i-1][j]+1),
- dp[i-1][j-1]+1);
- }
- }
-
- return dp[l1][l2];
- }
- }