ED—编辑距离

题目

给你两个单词 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 casefor (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.rhkb.cn/news/422890.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【kafka-01】kafka安装和基本核心概念

一&#xff0c;kafka安装和基本核心概念 1&#xff0c;kafka的安装和运行 1.1 kafka下载和安装 下载地址&#xff0c;目前下载的版本是 Scala 2.12 - kafka_2.12-3.6.2.tgz (asc, sha512)&#xff0c;一定要下载二进制文件&#xff0c;不要下载源码 https://kafka.apache.o…

数据库-基本操作(一)

1、查看数据库的端口号 2、在student数据库下创建一个users表格 3、给一个表格添加数据&#xff0c;并查询该表格 4、查询mysql数据库的错误日志信息 5、测试jmeter与mysql服务器的通信是否正常&#xff0c;使用ping

什么是人力资源管理软件?HR人力软件有哪些功能?

在人力资源管理中&#xff0c;随着科技的迅猛发展和商业环境的日益复杂化&#xff0c;企业对人力资源管理系统&#xff08;eHR&#xff09;的需求不断增加。人力资源管理软件&#xff0c;简称eHR&#xff0c;是一种融合了系统学理论方法的管理工具&#xff0c;旨在通过技术手段…

似然函数与先验概率、后验概率的关系

似然函数、先验概率、后验概率这三个概念是贝叶斯统计中的核心概念&#xff0c;它们共同描述了如何根据已有数据更新我们对某个事件或参数的认识。下面用简单的语言解释这三个概念&#xff0c;并描述它们之间的关系。 1. 先验概率&#xff08;Prior Probability&#xff09; …

代码随想录27期|Python|Day54|​单调栈|​42. 接雨水|84. 柱状图中最大的矩形

42. 接雨水 根据常识可以归纳出&#xff0c;对于每一列所能够存住的水的高度 Height min(LeftMax, RightMax) - height 也就是&#xff0c;当前列的存水高度 左侧和右侧柱子的最大高度的较小值&#xff0c;减去当前列的柱子高度&#xff0c;所得到的差值。 可以验证第4列&…

随手记:uniapp小程序登录方式和小程序使用验证码登录

小程序登录方式&#xff1a; 方式一&#xff1a;小程序授权登录 通过uni.login获取 临时登录凭证code&#xff0c;向后端换取token。 <u-button type"primary" shape"circle" click"login">登 录</u-button>login() {uni.login({p…

深入探索 Ubuntu:从基础到高级应用

本文深入探讨了 Ubuntu 操作系统&#xff0c;涵盖了其起源与发展、安装与配置、软件管理、系统优化、网络配置、安全防护以及在不同领域的应用等多个方面。 在起源与发展部分&#xff0c;介绍了 Ubuntu 于 2004 年创立的背景以及其版本的演进。安装与配置环节详细阐述了系统安…

【练习10】链表相加

链接&#xff1a;链表相加(二)_牛客题霸_牛客网 (nowcoder.com) 分析&#xff1a; 算法原理是逆序高精度算法 逆序的原因是为了实现从低位&#xff08;个位&#xff09;开始相加。 public class Solution {//逆序链表public ListNode reverse(ListNode head){ListNode newHead …

动态规划的解题思想

1. 从斐波那契数列说起 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c; &#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0, F(2) 1 F&#xff08;n&#xff09; F&…

机器学习--卷积神经网络(包括python实现)

卷积神经网络 1. 计算方法 &#xff08;1&#xff09;输入和输出channel 1时 首先我们要知道channel是什么意思&#xff0c;顾名思义channel就是“通道”的意思qwq。我们来举个例子&#xff0c;在计算机视觉中&#xff0c;如果一张图片是黑白的&#xff0c;那么每个像素点都…

Linux中使用Docker构建Nginx容器完整教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

JD18年秋招笔试疯狂数列python解答

问题如下&#xff1a; 链接&#xff1a;疯狂序列_京东笔试题_牛客网 [编程题]疯狂序列 热度指数&#xff1a;149 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32M&#xff0c;其他语言64M 东东从京京那里了解到有一个无限长的数字序列: 1…

uniapp 做一个查看图片的组件,图片可缩放移动

因为是手机端&#xff0c;所以需要触摸可移动&#xff0c;双指放大缩小。 首先在components里建个组件 查看图片使用 uni-popup 弹窗 要注意 transform的translate和scale属性在同一标签上不会一起生效 移动就根据触摸效果进行偏移图片 缩放就根据双指距离的变大变小进行缩…

DFS算法专题(二)——穷举vs暴搜vs深搜vs回溯vs剪枝【OF决策树】

目录 1、决策树 2、算法实战应用【leetcode】 2.1 题一&#xff1a;全排列 2.2.1 算法原理 2.2.2 算法代码 2.2 题二&#xff1a;子集 2.2.1 算法原理【策略一】 2.2.2 算法代码【策略一】 2.2.3 算法原理【策略二&#xff0c;推荐】 2.2.4 算法代码【策略二&#x…

浅谈基于负荷时空均衡和弹性响应的电动汽车快充电价定价策略

摘要&#xff1a;为了引导电动汽车有序充电&#xff0c;提出了一种考虑负荷时空均衡和弹性响应的电动汽车快充电价定价策略。引入交通流理论描述交通路网&#xff0c;建立电动汽车快充负荷时空分布模型&#xff1b;考虑配电网调度和电动汽车快充负荷的弹性需求&#xff0c;构建…

React Native 0.76,New Architecture 将成为默认模式,全新的 RN 来了

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…

轻松搞定Arduino开发环境,像玩积木一样简单!

朋友们,有没有人和我一样,曾经对Arduino望而却步?说到“开发环境”这几个字,感觉脑子就要爆炸了,光是想象安装各种软件、调试环境就能把人吓跑。相信我,我也曾有过这样的感觉。但是,当我真正开始玩Arduino后,我发现一切都不像想象中那么复杂!其实,搭建Arduino开发环境…

光耦合器的工作原理和故障诊断

光耦合器&#xff0c;也称为光隔离器&#xff0c;是现代电子设备中必不可少的组件&#xff0c;尤其是在确保系统不同部分之间的电气隔离方面。它们通过使用光传输信号来防止高压或不需要的信号影响敏感组件。在本文中&#xff0c;我们将讨论光耦合器的工作原理、故障诊断和识别…

安泰功率放大器有哪些特点呢

功率放大器是电子设备中的重要组成部分&#xff0c;其作用是将输入信号的电功率放大到足够的水平&#xff0c;以驱动负载&#xff0c;如扬声器或天线。功率放大器有一些独特的特点&#xff0c;这些特点对于各种应用至关重要。下面将详细介绍功率放大器的特点&#xff0c;以更好…

Unity教程(十五)敌人战斗状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…