最短编辑距离问题与动态规划----LeetCode 72.编辑距离

动态规划(Dynamic Programming, DP)是解决复杂问题的一个强大工具,它将问题分解成更小的子问题,并使用这些子问题的解决方案来构建整体问题的解决方案。在深入探讨最短编辑距离问题之前,让我们先理解什么是动态规划,以及如何通过动态规划的视角来看待这个问题。

原题链接:72. 编辑距离 - 力扣(LeetCode)

动态规划分析

动态规划的核心

动态规划通常用于求解最优化问题。其核心思想包括两个主要部分:

  1. 最优子结构:问题的最优解包含其子问题的最优解。这意味着我们可以通过合并子问题的最优解来构造整个问题的最优解。

  2. 重叠子问题:在解决问题的过程中,问题被分解成若干个子问题,其中很多子问题是重复的。

最短编辑距离的动态规划解法

在最短编辑距离问题中,我们要将一个字符串word1转换成另一个字符串word2,并且我们希望所需的操作次数尽可能少。这里的操作包括插入、删除和替换字符。

集合定义

在这个问题中,我们定义f[i][j]word1的前i个字符转换到word2的前j个字符所需的最少操作次数。这个定义本身就隐含了一个最优子结构的性质,即要得到f[i][j]的值,我们可以依赖于f[i-1][j]f[i][j-1]f[i-1][j-1]的值,这些都是更小的子问题。

属性

在这个场景下,我们关注的属性是最小值(min),因为我们要找的是最少的操作次数。

转移方程

为了构建f[i][j],我们考虑以下三种可能的最后一步操作:

  • 插入:我们可以先将word1的前i个字符转换为word2的前j-1个字符,然后在末尾插入word2的第j个字符。这给我们 f[i][j-1] + 1 

  • 删除:我们可以先将word1的前i-1个字符转换为word2的前j个字符,然后删除word1的第i个字符。这给我们 f[i-1][j] + 1 

  • 替换或保持如果word1[i]word2[j]相同,我们不需要任何操作,只需要保持即可。如果它们不同,我们需要将word1[i]替换为word2[j],这给我们 f[i-1][j-1] + 1(如果不同)或f[i-1][j-1](如果相同)。

综上所述,转移方程可以表示为:

f[i][j] = min(      f[i][j - 1] + 1, f[i - 1][j] + 1, f[i - 1][j - 1] + (word1[i] != word2[j]));

其中,(word1[i]  !=  word2[j]) 是一个指示函数,word1[i]不等于word2[j]时值为1,否则为0。

实现

基于上述分析,我们可以实现动态规划解法来解决最短编辑距离问题。

class Solution {public int minDistance(String word1, String word2) {int n = word1.length();int m = word2.length();int[][] f = new int[505][505];// 有一个字符串为空串if (n * m == 0) {return n + m;}for (int i = 1; i <= n; i++ ) {f[i][0] = i;}for (int i = 1; i <= m; i++ ) {f[0][i] = i;}for (int i = 1; i <= n; i++ ) {for (int j = 1; j <= m; j++ ) {f[i][j] = Math.min(f[i - 1][j] + 1, f[i][j - 1] + 1);f[i][j] = Math.min(f[i][j], f[i - 1][j - 1] + (word1.charAt(i - 1) == word2.charAt(j - 1) ? 0 : 1));}}return f[n][m];}
}

 

import java.util.*;public class Main{public static void main(String[] args) {Scanner sca = new Scanner(System.in);int N = 1010; // 假设字符串的最大长度char[] a = new char[N];char[] b = new char[N];int[][] f = new int[N][N]; // 动态规划数组int n = sca.nextInt(); // word1的长度String A = sca.next(); // word1int m = sca.nextInt(); // word2的长度String B = sca.next(); // word2// 初始化边界条件for (int i = 1; i <= n; i++ ) {a[i] = A.charAt(i - 1);f[i][0] = i;}for (int i = 1; i <= m; i++ ) {b[i] = B.charAt(i - 1);f[0][i] = i;}// 动态规划填表for (int i = 1; i <= n; i++ ) {for (int j = 1; j <= m; j++ ) {f[i][j] = Math.min(f[i][j - 1] + 1, f[i - 1][j] + 1);if (a[i] == b[j]) f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]);else f[i][j] = Math.min(f[i][j], f[i - 1][j - 1] + 1);}}System.out.println(f[n][m]); // 输出结果}
}

时间复杂度

这个解法的时间复杂度为O(nm),其中nm分别是字符串word1word2的长度。这是因为我们需要填充一个n x m的二维数组。

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

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

相关文章

政安晨的AI笔记——Bard大模型最新提示词创作绘画分析

AI大模型进入商业应用元年后的第一年&#xff0c;顶级模型大混战终于开始了。 Bard在追赶OpenAI的过程中&#xff0c;还是补上了画图的短板。 &#xff08;相比于视频的5阶张量处理而言&#xff0c;图画做为4阶张量处理虽然不新鲜&#xff0c;但却是跨不过去的基础条件&#…

Open CASCADE学习|拉伸

目录 1、沿方向拉伸 2、沿路径拉伸 3、变形拉伸 1、沿方向拉伸 #include <Geom_CylindricalSurface.hxx> #include <gp_Ax3.hxx> #include <GeomAPI_Interpolate.hxx> #include <BRepAdaptor_Curve.hxx> #include <BRepBuilderAPI_MakeEdge.hxx&…

假期刷题打卡--Day23

1、MT1190分数乘法 输入5组分数&#xff0c;对他们进行乘法运算&#xff0c;输出结果。不考虑分母为0等特殊情况。 格式 输入格式&#xff1a; 输入整型&#xff0c;每组一行&#xff0c;如样例所示。 输出格式&#xff1a; 输出计算结果实型&#xff0c;如样例所示。 样…

【开源】JAVA+Vue+SpringBoot实现二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

echarts使用之饼图(四)

1 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" cont…

算法学习——华为机考题库9(HJ56 - HJ63)

算法学习——华为机考题库9&#xff08;HJ56 - HJ63&#xff09; HJ56 完全数计算 描述 完全数&#xff08;Perfect number&#xff09;&#xff0c;又称完美数或完备数&#xff0c;是一些特殊的自然数。 它所有的真因子&#xff08;即除了自身以外的约数&#xff09;的和&…

思科模拟器实验合集

目 录 实验一 常用网络命令的使用.................................... 1 实验二 双绞线制作.................................................. 12 实验三 网络模拟软件.............................................. 15 实验四 交换机基本配置..................…

Linux进程信号(2)--信号的保存

目录 1.阻塞信号 1.1 信号其他相关常见概念 1.实际执行信号的处理动作称为信号递达(Delivery&#xff09; 2.信号从产生到递达之间的状态,称为信号未决(Pending)。 3.进程可以选择阻塞 (Block )某个信号。 1.2信号在内核中的表示 sigset_t 信号集操作函数 使用sigprocm…

套路化编程 C# winform 自适应缩放布局

本例程实现基本的自适应缩放布局。 在本例程中你将会学习到如何通过鼠标改变界面比例&#xff08;SplitContainer&#xff09;、如何使用流布局&#xff08;FlowLayoutPanel&#xff09;排列控件&#xff0c;当然首先需要了解如何设置控件随窗口缩放。 目录 创建项目 ​编辑…

视频业务像素、带宽、存储空间计算

一、像素和分辨率 分辨率的单位通常是像素&#xff08;或点&#xff09;&#xff0c;用水平像素数乘以垂直像素数来表示。例如&#xff0c;一个分辨率为1920 x 1080的屏幕有1920个水平像素和1080个垂直像素。 总像素分辨率公式运算 例如 1920 x 10802073600总约200万 500W≈…

Elasticsearch:使用 Inference API 进行语义搜索

在我之前的文章 “Elastic Search 8.12&#xff1a;让 Lucene 更快&#xff0c;让开发人员更快”&#xff0c;我有提到 Inference API。这些功能的核心部分始终是灵活的第三方模型管理&#xff0c;使客户能够利用当今市场上下载最多的向量数据库及其选择的转换器模型。在今天的…

SQL注入其他方法

此次实验因为环境问题很多无法复现&#xff0c;在此只讨论过程和方法 一、SQL注入之outfile注入 mysql的outfile的作用是导出文件&#xff0c;使用此方法的必要条件&#xff1a;&#xff08;此方法成功率极低&#xff09; 1、知道目标网站的物理路径&#xff1b; 2、%secur…