2025年- H93-Lc201-- 64.最小路径和(多维动态规划)--Java版

1.题目描述

2025年- H93-Lc201-- 64.最小路径和(多维动态规划)--Java版_第1张图片

2.思路

(1)dp含义:
dp[i][j]以i-1的word1字符串和j-1的word2字符串的最少操作次数。
(2)递推公式:
1)word1[i-1]和word2[j-1]相等的情况
此时的字符串是不需要操作,i-2和j-2的操作次数与(i-1和j-1)的操作次数相等
dp[i][j]=dp[i-1][j-1]
2)word1[i-1]和word2[i-1]不相等的情况
删除和添加是互逆的,操作步数是一样的
word1(字符多)可以通过删除操作变成word2(字符少)
word2(字符少)可以通过添加操作变成word1(字符多)
++++++++++++
增加
dp[i][j]
++++++++++++
删除
(此时word1最后一个元素是i-1,所以不考虑最后一个元素应该是保留i-2。word2的最后一个元素是j-1,不考虑word2的删除操作)
dp[i][j]=dp[i-1][j]+1,1代表加了删除的操作才变成dp[i][j]
(此时word1最后一个元素是i-1,不考虑word2的删除操作。word2的最后一个元素是j-1,所以不考虑最后一个元素应该是保留j-2)
dp[i][j]=dp[i][j-1]+1,1代表加了删除的操作才变成dp[i][j]
++++++++++++
替换
ab变成ac(不改变字符串的长度,让两个字符串相等)
dp[i][j]=dp[i-1][j-1]+1

最后在替换、删除、添加操作取个最小值(最少操作次数)
(3)初始化
由左上方推导的dp[i][j],所以要初始化第一行(从左到右)和第一列(从上到下)
要多少步骤让字符串变成空串
dp[i][0]=i,dp[0][j]=j
for(int i=0;i<=word.size();i++)
dp[i][0]=i;
(4)遍历
(5)打印dp数组

3.代码实现

class Solution {
    public int minDistance(String word1, String word2) {
        //行数
        int m=word1.length();
        //列数
        int n=word2.length();
        //dp含义,a 数组下标是从 0 到 m-1、n-1,但你用了 m 和 n。
        int[][] dp=new int[m+1][n+1];
        //初始化第一行,列数是变化的,怎么让第一列用最少的操作次数回到空串
        //这只初始化到 n - 1 和 m - 1,但你会访问 dp[0][n]、dp[m][0],也会越界。
        for(int j=0;j<=n;j++)
        {
            dp[0][j]=j;
        }
        //初始化第一列,行数是变化的,怎么让第一行用最少的操作次数回到空串
        //为什么i会取到m,这是留一个位置存储空字符串
        for(int i=0;i<=m;i++)
        {
            dp[i][0]=i;
        }
        //递推公式
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {//要从dp[0][0]开始比较,所以 是i-1,j-1
                if(word1.charAt(i-1)==word2.charAt(j-1))
                {
                    dp[i][j]=dp[i-1][j-1];
                }
                else
                {//Math.min只能两两比较,如果字符串不相等,则要考虑删除、插入、替换操作
                //删除和插入互为逆过程,所以二者互换也是不影响的,Math.min(删除,Math.min(插入,替换))
                dp[i][j]=1+Math.min(dp[i-1][j],Math.min(dp[i][j-1],dp[i-1][j-1]));
                }
            }
        }
        return dp[m][n];
    }
}

你可能感兴趣的:(java,leetcode,动态规划,java,算法)