题解 | #牛群编号变更# java
牛群编号变更
https://www.nowcoder.com/practice/9295f0f796b34793832710d5c939a619
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param word1 string字符串 * @param word2 string字符串 * @return int整型 */ // write code here 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]; } }
该代码使用的编程语言是Java。
代码考察的知识点包括动态规划和字符串操作。
代码的文字解释大纲如下:
- 代码的目标:计算将字符串
word1
转换为word2
所需的最小操作次数(编辑距离)。 - 输入参数:
word1
和word2
分别表示两个字符串。 - 返回值:整型,表示最小操作次数。
- 首先,获取字符串
word1
和word2
的长度n
和m
。 - 创建一个二维整型数组
f
,大小为(n+1)×(m+1)
,用于记录子问题的结果。 - 初始化第一行和第一列,即将空字符串转换为
word1
和word2
所需的最小操作次数。 - 使用两层循环遍历所有可能的转换情况。
- 在每个位置
(i, j)
上,计算当前位置所需的最小操作次数。 - 假设当前位置对应的
word1
和word2
的索引分别为i-1
和j-1
。 - 判断当前位置的字符是否相等,如果相等,则不需要进行操作,结果与前一个位置相同,即
f[i][j] = f[i-1][j-1]
。 - 如果当前位置的字符不相等,则需要进行插入、删除或替换操作,取三种操作中的最小次数并加一,即
f[i][j] = min(f[i][j-1], f[i-1][j], f[i-1][j-1]) + 1
。 - 循环结束后,返回
f[n][m]
的值作为最终结果,表示将字符串word1
转换为word2
所需的最小操作次数。