【算法】动态规划—编辑距离

news2024/11/23 17:01:38

题目

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

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

思路分析

        编辑距离问题就是给定两个字符串 s1 和 s2,只能用三种操作把 s1 变成 s2,求最少的操作数。需要明确的是,不管是把 s1 变成 s2 还是反过来,结果都是一样的,所以下面就以 s1 变成 s2 举例。

        解决两个字符串的动态规划问题,一般都是用两个指针 i, j 分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。

        设两个字符串分别为 "rad" 和 "apple",为了把 s1 变成 s2,算法会这样进行:

        当 s1[i] == s[j] 时,什么都不做(skip);

        j 走完 s2,但 i 还没走完 s1,那么就用删除操作把 s1 缩短为 s2。

        i 走完 s1,但 j 还没走完 s2,那么就用插入操作把 s2 剩下的字符全部插入 s1。

代码详解

        base case 是 i 走完 s1 或 j 走完 s2,可以直接返回另一个字符串剩下的长度。

        对于每对字符 s1[i] 和 s2[j],可以有4种操作:

        if s1[i] == s2[j]:

                什么都不做(skip)

                i, j 同时向前移动

        else:

                三选一:

                插入(insert)

                删除(delete)

                替换(replace)

        ”状态“就是算法在推进过程中会变化的变量,显然这里就是指针 i 和 j 的位置。

        ”选择“就是对于每一个状态,也就是 skip,insert,delete,replace 这4种操作做出选择。

递归代码

package DynamicProgramming;

// leetcode 72 编辑距离

// 暴力解法,递归(超出时间限制)
public class EditDistance {

    private String s1;
    private String s2;

    public int minDistance(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
        // i, j 初始化指向最后一个索引
        return dp(s1.length() - 1, s2.length() - 1);
    }

    public int dp(int i, int j) {
        // base case,递归终止条件
        if (i == -1) {
            return j + 1;
        }
        if (j == -1) {
            return i + 1;
        }
        // 做选择,递归操作
        if (s1.charAt(i) == s2.charAt(j)) {
            return dp(i - 1, j - 1); // 什么都不做,i 和 j 向前移动一位
        }
        return Math.min(dp(i - 1, j - 1) + 1, // 替换
                Math.min(dp(i, j - 1) + 1, // 插入
                        dp(i - 1, j) + 1) // 删除
        );
    }

    public static void main(String[] args) {
        EditDistance editDistance = new EditDistance();
        int count = editDistance.minDistance("rad", "apple");
        System.out.println(count);
    }

}

引入 DP table

        首先明确 dp 数组的含义,dp 数组是一个二维数组,长这样:

        dp[...][0] 和 dp[0][...] 对应 base case,dp[i][j] 的含义和之前的 dp 函数类似。dp 函数的 base case 是 i, j 等于-1,而数组索引至少是0,所以 dp 数组会偏移一位。既然 dp 数组和递归 dp 函数含义一样,也就可以直接套用之前的思路写代码,唯一不同的是,DP table 是自底向上求解,递归解法是自顶向下求解:

package DynamicProgramming;

// 引入 dp table
public class EditDistance {

    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        int[][] dp = new int[m + 1][n + 1];
        // base case
        for (int i = 1; i <= m; i++) {
            dp[i][0] = i;
        }
        for (int j = 1; j <= n; j++) {
            dp[0][j] = j;
        }
        // 自底向上求解
        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] + 1,
                            Math.min(dp[i][j - 1] + 1,
                                    dp[i - 1][j] + 1)
                    );
                }

            }
        }
        // 存储整个 s1 和 s2 的最小编辑距离
        return dp[m][n];
    }

    public static void main(String[] args) {
        EditDistance editDistance = new EditDistance();
        int count = editDistance.minDistance("rad", "apple");
        System.out.println(count);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32外设-0.96寸OLED显示屏

江科大OLED教程&#xff1a;01-快速上手&#xff08;上集&#xff09;_哔哩哔哩_bilibili 01 0.96寸OLED显示屏原理 1.1 0.96寸OLED显示屏简介 适用器件&#xff1a; 0.96寸OLED显示屏&#xff08;驱动芯片&#xff1a;SSD1306 / SSD1315&#xff09; 1.3寸OLED显示屏&…

针对国内AIGC市场,国内目前出台了那些法律法规?

针对国内AIGC市场&#xff0c;特别是AI生成与合成内容方面&#xff0c;中国已经出台了一系列法律法规来规范其发展和应用。 图片源自“央视新闻” 以下是一些主要的法律法规&#xff1a; 一、国家层面的法律法规 《中华人民共和国网络安全法》 施行时间&#xff1a;2017年6月…

【课程学习】信号检测与估计II

b站 文章目录 1-概述贝叶斯方法1-概述 线性、正交、平稳、高斯 研究线性模型,采用正交化方法,假设信号平稳,考虑信号的统计特性是高斯的。 本学期考虑,非线性、非正交、非平稳、非高斯。 阵列处理 1980-1990 MUSIC 稀疏性 2006-2012 LASS 时频分析 1995-2000 小波 贝叶斯 2…

echarts 自定义标注样式自定义tooltip弹窗样式

文章目录 1. 实现根据经纬度自定义标注图片样式2. 实现鼠标悬浮标注自定义弹窗样式内容 1. 实现根据经纬度自定义标注图片样式 设置 symbol 属性为 image://${require("/assets/img/dataView/point.png")} 图片地址即可&#xff0c;注意前面跟 image:// 特有的写法b…

搭建一个基于角色的权限验证框架

说明&#xff1a;基于角色的权限验证&#xff08;Role-Based Access Control&#xff0c;RBAC&#xff09;框架&#xff0c;是目前大多数服务端的框架。本文介绍如何快速搭建一个这样的框架&#xff0c;不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 RBAC 基于…

【图像匹配】基于‌墨西哥帽小波(Marr小波)算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于‌墨西哥帽小波&#xff08;Marr小波&#xff09;算法的图像匹配&#xff0c;用…

09_Python流程控制_分支

流程控制 流程控制是管理程序执行顺序的重要组成部分。分支&#xff08;也称为条件语句&#xff09;是流程控制的一种形式&#xff0c;它允许程序根据某些条件的真假来选择执行不同的代码路径。 顺序结构&#xff1a;按部就班执行选择结构&#xff1a;根据条件不同执行循环结…

项目实训:CSS基本布局理解——WEB开发系列38

对CSS学习已经接近尾声&#xff0c;下面你可以对以下两道“小卡拉米”测试进行测试下CSS理解程度。 题 1&#xff1a;基于栅格布局的现代博客首页设计 题目要求&#xff1a; 创建一个博客首页布局&#xff0c;包含一个顶部导航栏、一个主要的内容区域&#xff08;左侧为博客文…

Netty笔记09-网络协议设计与解析

文章目录 前言一、协议设计1. 数据格式2. 消息长度3. 编码方式4. 错误处理5. 安全性 二、协议解析1. 消息分隔2. 粘包与半包处理3. 校验机制 三、为什么需要协议&#xff1f;四、redis 协议五、HTTP 协议六、自定义协议要素编解码器&#x1f4a1; 什么时候可以加 Sharable 前言…

使用 PHPstudy 建立ThinkPHP8 本地集成环境

安装Composer 下载地址&#xff1a;https://getcomposer.org/Composer-Setup.exehttps://getcomposer.org/Composer-Setup.exe 打开PHPstudy创建网站&#xff1a; cmd终端进入PHPstudy www根目录下&#xff1a; 执行代码&#xff1a;cd phpstudy www 根目录地址 cd C:\phpst…

甲骨文发布全球首个采用英伟达™(NVIDIA®)Blackwell GPU的Zettascale人工智能超级计算集群

甲骨文公司宣布推出全球首个Zettascale云计算集群。 该集群配备了令人印象深刻的 131,072 个英伟达Blackwell GPU&#xff0c;能够提供 2.4 ZettaFLOPS 的峰值性能。 这一强大的人工智能基础设施使企业能够以更大的灵活性和主权处理大规模人工智能工作负载。 Oracle云计算基础…

算法_宽度优先搜索解决FloodFill---持续更新

文章目录 前言什么是FloodFill算法图像渲染题目要求题目解析代码如下 岛屿数量题目要求题目解析代码如下 岛屿的最大面积题目要求题目解析代码如下 被围绕的区域题目要求题目解析代码如下 前言 本文将会向你介绍宽度优先搜索解决FloodFill算法相关题型&#xff1a;图像渲染、岛…

2019-2023(CSP-J)选择题真题解析

1&#xff0c;了解的知识 中国的国家顶级域名是&#xff08; &#xff09;【2019年CSP-J初赛选择题第一题】 A…cn B…ch C…chn D…china 【答案】&#xff1a;A 以下哪个奖项是计算机科学领域的最高奖&#xff1f;&#xff08; &#xff09;【2019年CSP-J初赛选择题第…

2025年最新大数据毕业设计选题-基于Hive分析相关

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向&#xff0c;比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向&#xff0c;比如民宿分析、电商行为分析、天气分析等等。。。…

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件 日历期间、年期间、月期间及时分期间组件在不同的应用场景中发挥着重要的作用。这些组件通常用于表单、应用程序或网站中&#xff0c;以方便用户输入和选择特定的日期和时间范围。以下是这些组件的主要作用&a…

【读书】原则

后面的 太长了&#xff0c;而且太多了 我看作者 49年的 0多岁的老人的谆谆教诲 太多了 一下子吃不消 分为 生活原则 和 工作原则 倡导 人要以 原则而活 要做到极度透明 极度求真和极度透明&#xff1a;在软件开发中&#xff0c;对事实的执着追求和对信息的透明度是至关重要的。…

dedecms——四种webshell姿势

姿势一&#xff1a;通过文件管理器上传WebShell 步骤一&#xff1a;访问目标靶场其思路为 dedecms 后台可以直接上传任意文件&#xff0c;可以通过文件管理器上传php文件获取webshell 步骤二&#xff1a;登陆到后台点击【核心】--》 【文件式管理器】--》 【文件上传】将准备好…

linux系统如何通过进程PID号找到对应的程序在系统中的路径

linux系统如何通过进程PID号找到对应的程序在系统中的路径 首先我们用ps -aux​命令找到对应进程的PID号&#xff0c;比如我这里要得就是xmrig这个进程的PID号 ​​ 通过lsof命令查看对应进程的关联的文件&#xff0c;并找到可执行文件的路径 lsof -p 22785 | grep txt​​ 或…

SpringCloud Feign 以及 一个标准的微服务的制作

一个标准的微服务制作 以一个咖啡小程序项目的订单模块为例&#xff0c;这个模块必将包括&#xff1a; 各种实体类&#xff08;pojo,dto,vo....&#xff09; 控制器 controller 服务类service ...... 其中控制器中有的接口需要提供给其他微服务&#xff0c;订单模块也需要…

软件无线电2:矢量信号器和HackRF实现FM调制解调

前面实现了在matlab平台下的FM收发&#xff0c;那么如果将matlab中的数据应用在真实的无线电台中会是怎样呢&#xff1f;于是我们借助矢量信号器和HackRF实现了射频下的FM调制解调。注意本文仅用于科研和学习&#xff0c;私自搭建电台属于违法行为。 1. 概述 整体实现框图如下…