文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【解题思路】
- 七【题目提示】
- 八【时间频度】
- 九【代码实现】
- 十【提交结果】
一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
- 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
- 你可以对一个单词进行如下三种操作:
五【题目示例】
-
示例 1:
- 输入:word1 = “horse”, word2 = “ros”
- 输出:3
- 解释:
- horse -> rorse (将 ‘h’ 替换为 ‘r’)
- rorse -> rose (删除 ‘r’)
- rose -> ros (删除 ‘e’)
-
示例 2:
- 输入:word1 = “intention”, word2 = “execution”
- 输出:5
- 解释:
- intention -> inention (删除 ‘t’)
- inention -> enention (将 ‘i’ 替换为 ‘e’)
- enention -> exention (将 ‘n’ 替换为 ‘x’)
- exention -> exection (将 ‘n’ 替换为 ‘c’)
- exection -> execution (插入 ‘u’)
六【解题思路】
- 本题较困难,利用动态规划的思想
- 首先定义dp[i][j]dp[i][j]dp[i][j]表示word1word1word1的前iii个字符和word2word2word2的前jjj个字符之间的编辑距离
- 之后分两种情况:
- word1word1word1的前iii个字符和word2word2word2的前jjj个字符不相同:
- 插入一个字符:dp[i][j]=dp[i][j−1]dp[i][j]=dp[i][j-1]dp[i][j]=dp[i][j−1]
- 删除一个字符:dp[i][j]=dp[i−1][j]dp[i][j]=dp[i-1][j]dp[i][j]=dp[i−1][j]
- 替换一个字符:dp[i][j]=dp[i−1][j−1]dp[i][j]=dp[i-1][j-1]dp[i][j]=dp[i−1][j−1]
- 不管是以上哪种,都需要+1+1+1,因为都是一步操作
- word1word1word1的前iii个字符和word2word2word2的前jjj个字符相同:
- 取dp[i][j]dp[i][j]dp[i][j]和dp[i−1][j−1]dp[i-1][j-1]dp[i−1][j−1]之间的最小值,因为word1word1word1的前iii个字符和word2word2word2的前jjj个字符相同,说明不需要操作
- 还需要注意一些细节,初始化第一列为iii(遍历word1word1word1),因为word1word1word1的每步字符串变为长度为000都需要iii步;初始化第一行为jjj(遍历word2word2word2),因为word2word2word2的每步字符串变为长度为000都需要jjj步
- 最后返回dp[m][n]dp[m][n]dp[m][n]即可,其中m、nm、nm、n分别为两个字符串的长度
七【题目提示】
- 0<=word1.length,word2.length<=5000 <= word1.length, word2.length <= 5000<=word1.length,word2.length<=500
- word1和word2由小写英文字母组成word1 和 word2 由小写英文字母组成word1和word2由小写英文字母组成
八【时间频度】
- 时间复杂度:O(mn)O(mn)O(mn),其中m、nm、nm、n分别为两个字符串的长度
- 空间复杂度:O(mn)O(mn)O(mn),其中m、nm、nm、n分别为两个字符串的长度
九【代码实现】
- Java语言版
package String;/*** @Author: IronmanJay* @Description: 72.编辑距离* @CreateTime: 2022-12-03 10:27*/
public class p72_EditDistance {public static void main(String[] args) {String word1 = "horse";String word2 = "ros";int res = minDistance(word1, word2);System.out.println("res = " + res);}public static int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i < m + 1; i++) {dp[i][0] = i;}for (int i = 0; i < n + 1; i++) {dp[0][i] = i;}for (int i = 1; i < m + 1; i++) {for (int j = 1; j < n + 1; j++) {dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i][j]);}}}return dp[m][n];}}
- C语言版
#include
#includeint minDistance(char * word1, char * word2)
{int dp[501][501];int m = strlen(word1);int n = strlen(word2);dp[0][0] = 0;for (int i = 0; i <= m; i++){dp[i][0] = i;}for (int j = 0; j <= n; j++){dp[0][j] = j;}for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){dp[i][j] = fmin(dp[i][j - 1], fmin(dp[i - 1][j], dp[i - 1][j - 1])) + 1;if (word1[i - 1] == word2[j - 1]){dp[i][j] = fmin(dp[i][j], dp[i - 1][j - 1]);}}}return dp[m][n];
}/*主函数省略*/
十【提交结果】
-
Java语言版

-
C语言版
![在这里插入图片描述]()