leetcode -编辑距离

为了求解将 `word1` 转换成 `word2` 所需的最少操作数,可以使用动态规划。以下是详细的解决方案:

方法思路

  1. **定义状态**

`dp[i][j]` 表示将 `word1` 的前 `i` 个字符转换成 `word2` 的前 `j` 个字符所需的最少操作数。

  1. **状态转移方程**
  • 如果 `word1[i-1] == word2[j-1]`(字符相同),直接继承前一步的结果:

`dp[i][j] = dp[i-1][j-1]`。

  • 如果字符不同,选择以下三种操作中的最小值:

  • **替换**:`dp[i-1][j-1] + 1`(替换当前字符)。

  • **删除**:`dp[i-1][j] + 1`(删除 `word1` 的第 `i` 个字符)。

  • **插入**:`dp[i][j-1] + 1`(在 `word1` 末尾插入字符以匹配 `word2` 的第 `j` 个字符)。

  1. **初始化**
  • `dp[i][0] = i`:将 `word1` 的前 `i` 个字符删除为空字符串需要 `i` 次操作。

  • `dp[0][j] = j`:将空字符串插入为 `word2` 的前 `j` 个字符需要 `j` 次操作。

解决代码

```java

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

String word1 = sc.nextLine();

String word2 = sc.nextLine();

System.out.println(minDistance(word1, word2));

}

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; i++) {

dp[i][0] = i; // 删除操作

}

for (int j = 0; j <= n; j++) {

dp[0][j] = j; // 插入操作

}

// 填充dp数组

for (int i = 1; i <= m; i++) {

for (int j = 1; j <= n; 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 - 1], // 替换

Math.min(dp[i - 1][j], dp[i][j - 1]) // 删除或插入

) + 1;

}

}

}

return dp[m][n];

}

}

```

代码解释

  1. **初始化**

处理边界情况,当其中一个字符串为空时,操作数为另一个字符串的长度。

  1. **动态规划填充**

遍历所有可能的子问题,根据字符是否相同选择直接继承或取三种操作的最小值。

  1. **时间复杂度**

\(O(m \times n)\),其中 \(m\) 和 \(n\) 分别为 `word1` 和 `word2` 的长度。

该方法通过动态规划高效地计算了最小编辑距离,覆盖了所有可能的操作情况。

相关推荐
我命由我1234540 分钟前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
励志要当大牛的小白菜2 小时前
ART配对软件使用
开发语言·c++·qt·算法
qq_513970442 小时前
力扣 hot100 Day56
算法·leetcode
武子康3 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
PAK向日葵3 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱喝矿泉水的猛男5 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展
YuTaoShao5 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw6 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨6 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
YouQian7726 小时前
Traffic Lights set的使用
算法