LeetCode 583.两个字符串的删除操作(动态规划)

270 阅读1分钟

题目描述:

给定两个单词 word1word2,找到使得 word1word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

在这里插入图片描述

提示:

         1.给定单词的长度不超过500500

         2.给定单词中的字符只含有小写字母。

动态规划(最长上升子序列)

时间复杂度OnmO(nm)

  • dp[i][j]表示word1的前i个字母与word2中的前j个字母相同的最小步数
  • 转移时,若第i个字母与第j个字母相同,那么不需要进行删除, dp[i][j]=dp[i-1][j-1]
  • 不相同就比较状态转移到dp[i-1][j]dp[i][j-1]的步数那个小
  • 初始化dp[i][0] = i,dp[0][j] = [j],最终答案是dp[n][m]

代码

class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length(),m = word2.length();
        int[][] dp = new int[n+10][m+10];
        for(int i = 1; i <= n; i ++) dp[i][0] = i;
        for(int j = 1; j <= m; j ++) dp[0][j] = j;
        for(int i = 1; i <= n; i ++){
            for(int j = 1; j <= m; 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],dp[i][j-1])+1;
            }
        }
        return dp[n][m];
    }
}
```