import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param word1 string字符串 
     * @param word2 string字符串 
     * @return int整型
     */
    public int minDistance (String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        int[][] f = new int[n + 1][m + 1];

        // 初始化第一行和第一列
        for (int i = 0; i <= n; ++i) {
            f[i][0] = i;
        }
        for (int j = 0; j <= m; ++j) {
            f[0][j] = j;
        }

        // 动态规划计算最小操作次数
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                f[i][j] = Math.min(f[i][j - 1], f[i - 1][j]) + 1;
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]);
                }
            }
        }

        return f[n][m];
    }
}

本题知识点分析:

1.动态规划

2.数学模拟

3.数组遍历

本题解题思路分析:

1.确定dp数组是什么?以及下标含义,dp数组为每一次两个字符串变成相同所小的次数

2.dp数组递推公式,因为题目中要求的是求最少变化次数,那么运用Math.min进行比较,选出要么是从右边走的,要么是从上边的中变化小的那个。 f[i][j] = Math.min(f[i][j - 1], f[i - 1][j]) + 1;

3.如果字符相同,那么是不需要加1的

  if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
            f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]);
 }

4.dp数组初始化,第一行和第一列不用变化就可以到达,因为字符串都为空,因此都设置为0

5.确定遍历顺序,是从dp[1][1]开始,其实和向右走和向下走是一样的。

本题使用编程语言: Java

如果您觉得本篇文章对您有帮助的话,可以点个赞支持一下,感谢~