IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【LeetCode】72. 编辑距离 【动态规划】 -> 正文阅读

[数据结构与算法]【LeetCode】72. 编辑距离 【动态规划】

题目链接:https://leetcode-cn.com/problems/edit-distance/

题目描述

给你两个单词?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')

提示:

0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成

题解

方法:动态规划

根据题目描述,对单词的操作一共有三种:

  • 插入一个字符;
  • 删除一个字符;
  • 替换一个字符。

而对于两个单词A、B就有6种操作,但是,我们发现:

  • 对单词A删除一个字母 等价于 对单词B插入一个字母;
  • 对单词A插入一个字母 等价于 对单词B删除一个字母;
  • 对单词A替换一个字母 等价于 对单词B替换一个字母。

这样,我们实际上只有3种不同的操作,如下:

  • 在单词A插入一个字符;
  • 在单词B插入一个字符;
  • 修改单词A的一个字符。

我们设置一个二维数组dp[][]来存储A和B的编辑距离,其中dp[i][j]的前 i 个字母和B的前 j 个字母之间的编辑距离。

  • 对于dp[i][j-1],我们在B的末尾插入一个字符,即得到单词A,即dp[i][j] 最小可以为?dp[i][j-1] + 1;
  • 对于dp[i-1][j],我们在A的末尾插入一个字符,即得到单词B,即dp[i][j] 最小可以为?dp[i-1][j] + 1;
  • 对于dp[i-1][j-1],如果A的第 i 个字母和B的第 j 个字母相同,则dp[i][j] 最小可以为dp[i-1][j-1];如果不同,则dp[i][j] 最小可以为?dp[i-1][j-1] + 1;

因此,我们的到以下状态转移方程:

如果A和B的最后一个字母相同:

dp[i][j] = min(dp[i][j-1]+1, dp[i-1][j]+1, d[i-1][j-1])

如果A和B的最后一个字母不同:

dp[i][j] = min(dp[i][j-1]+1, dp[i-1][j]+1, d[i-1][j-1]+1)

时间复杂度O(m*n),其中,m和n分别为word1和word2的长度。

空间复杂度O(m*n)

?代码

class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();        
        int[][] dp = new int[n + 1][m + 1];
        
        // 边界状态初始化
        for (int i = 0; i <= n; i++) {
            dp[i][0] = i;
        }
        for (int j = 0; j <= m; j++) {
            dp[0][j] = j;
        }

        // 计算dp值
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int cur = 0;
                if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
                    cur = 1;
                }
                dp[i][j] = Math.min(dp[i - 1][j - 1] + cur, 1 + Math.min(dp[i - 1][j], dp[i][j - 1]));
            }
        }

        return dp[n][m];
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:37:13  更:2021-08-29 09:37:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:52:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码