算法学习——动态规划 例题:两字符串转换权最小问题(java)

最小编辑代价(最小编辑距离) 题目描述: 给定两个字符串str1和str2,再给定三个整数ic,dc,rc,分别代表插入、删除、替换一个字符的代价,返回将str1编辑成str2的最小代价。 举例: str1=”abc” str2=”adc” ic=5 dc=3 rc=2,从”abc”编辑到”adc”把b替换成d代价最小,为2; str1=”abc” str2=”adc” ic=5 dc=3 ... 阅读详情

题目 :

给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入, 删除和替换一个字符的代价。返回将str1编辑成str2的最小代价。比如,str1="abc",str2="adc",ic=5,dc=3,rc=2.从"abc"编辑成adc, 吧b替换成d是代价最小的所以返回2.再比如,str1="abc",str2="adc",ic=5,dc=3,rc=100.从abc编辑成adc,先删除d,然后插入d是代价最小的, 所以返回8.

动态规划:

假设str1的长度为m,str2的长度为N,首先生成大小为(M+1)*(n+1)的矩阵dp,dp[i][j]的值代表str1[0...i-1]编辑成str2[0....j-1] 的最小代价,

思想理解(本人的通俗理解):

 动态规划无非就是动态的决定下一步的走向,不断规划下面的方向然后得到所想要的解;
    如本题首先我们可以把第一行第一列求出来非常简单。
    第一行就是用str1的第一个字符编辑成str2[j]所以就是i*ic
    第一列就是用str2用str[i]的所有字符编辑成str2[0]所以就是i*dc
    dp[i][j]后面的就想办法如何用之前的转换而来,如下图为了方便大家看我把dp打印出来
   情况1: 以dp[3][2]来看假设已经到了3,2我们如何来进行得到这个最小代价呢,首先它的前面dp[i][j-1](j-1)是一样的str1[0...i]组成了str2[0...j-1]
    现在需要组成str2[0...j]个字符现在得到了str2[0...j-1]然后再加一个字符也就是加上str2[j]则就编辑成了str2[0....j]递推式就是
    dp[i][j]=dp[i][j-1]+ic

   情况2:然后就是上面组成也就是可以由dp[i-1][j]也就是我可以用str1[0...i-1]编辑成str2[0....j]
   然后再把现在的str1中的最后一个没用到的删除掉递推表达式就是:dp[i][j]=dp[i-1][j]+dc
   新增和删除编译代价都有了那么我们来看一下修改替换的
   替换会分两种情况:

   情况3:dp[i][j]与dp[i-1][j-1]的关系,当str1[i]==str2[j]时也就是最后一个字符已经匹配的上,也就是他前i-1和j-1个编辑的最小代价
   就是现在dp[i][j]的代价;表达式也就是:dp[i][j]==dp[i-1][j-1](str1[i]==str2[j])

   情况4:显而易见也就是当str1[i]!=str2[j]时也就是最后一个字符匹配不上那么他就需要把str1[i]个替换成str2[j]
   剩下的也就是和上面的情况一样也就是str1[0...i-1]组成str2[0...j-1]的最小代价加上最后一个替换的代价就是这种情况的总得代价
   表达式:dp[i][j]==dp[i-1][j-1]+rc(str1[i]!=str2[j])

dp:
    0 5 10 15 20
    3 0 5 10 15
    6 3 2 7 12
    9 6 5 4 9
    12 9 6 7 6
    15 12 9 6 9
    18 15 12 9 8
public class DTGH_ChengeTwoString {
    public int chengeTwoString(String str1, String str2, int ic, int dc, int rc) {
        char[] str1s = str1.toCharArray();
        char[] str2s = str2.toCharArray();
        int m = str1s.length;
        int n = str2s.length;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            dp[i][0] = i * dc;
        }
        for (int i = 0; i < n; i++) {
            dp[0][i] = i * ic;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                int min1 = Math.min(dp[i - 1][j] + dc, dp[i][j - 1] + ic);
                if (str1s[i] == str2s[j]) {
                    dp[i][j] = Math.min(min1, dp[i - 1][j - 1]);
                } else {
                    dp[i][j] = Math.min(min1, dp[i - 1][j - 1] + rc);
                }
            }
        }
        //输出矩阵
        for (int i = 0; i <m ; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }
        return dp[dp.length - 1][dp[0].length - 1];
    }

    public static void main(String[] args) {
        DTGH_ChengeTwoString a = new DTGH_ChengeTwoString();
        System.out.println(a.chengeTwoString("ab12cd3", "abcdf", 5, 3, 2));
    }
}

 

动态规划系列问题-最小编辑代价 最小编辑代价(最小编辑距离) 题目描述: 给定两个字符串str1和str2,再给定三个整数ic,dc,rc,分别代表插入、删除、替换一个字符的代价,返回将str1编辑成str2的最小代价。 举例: str1="abc"   str2="adc"  ic=5    dc=3   rc=2,从"abc"编辑到"adc"把b替换成d代价最小,为2; str1="abc"   阅读详情

相关推荐

经典动态规划问题:最短编辑距离算法的原理及实现

编辑距离的定义 编辑距离(Edit Distance)最常用的定义就是Levenstein距离,是由俄国科学家Vladimir Levenshtein于1965年提出的,所以编辑距离一般又称Levenshtein距离。它主要作用是测量两个字符串的差异化程度,表示字符串a至少要经过多少个操作才能转换为字符串b,这里的操作包括三种:增加、删除、替换。 举个例子: (1)增加:对于字符串a:abc 和 ...

蓝天白云梦的csdn博客 1万+

刷题DAY16

给定两个字符串str1和str2,再给定三个整数ic、dc和rc,分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。

chara9885的博客 455

最小编辑距离算法JAVA实现

这是根据北大詹卫东老师的PPT,实现的biaji

williamsgo的专栏 3529

最小编辑代价

给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。 eg: str1="abc",str2="adc",ic = 5,dc = 3,rc = 2 从"abc"编辑成"adc",把'b'替换成'd'是代价最小的,所以返回2. /** * 最小编辑代价 */ public class Solution10 { // 经典动态规划 public static int minCost1(.

joeyin 381

JAVA算法:最小编辑字符操作数

JAVA算法:最小编辑字符操作数 给定两个字符串str1和str2及以下可以对str1执行的操作。查找将“str1”转换为“str2”所需的最小编辑(操作)数。 Insert Remove Replace All of the above operations are of equal cost. 例如: 给定字符串:str1 = "geek", str2 = "gesek" 输出结果为...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 1279

《糊涂算法》专栏目录——Java面试算法学习路线

一定要收藏这份学习路线

公号:一条coding 1万+

最小编辑代价(编辑距离问题改进版)

题目描述 给定两个字符串str1和str2,再给定三个整数ic,dc,rc,分别代表插入、删除、替换一个字符的代价,返回将str1编辑成str2的最小代价。 该题是基于经典动态规划问题编辑距离的改进版编辑距离问题 输入输出样例 输入1 str1=“abc” str2=“adc” ic=5 dc=3 rc=2 从"abc"编辑到"adc"把b替换成d代价最小,为2; 输出1 2 输入2 str1=“abc” str2=“adc” ic=5 dc=3 rc=10 从"

阳光大男孩!!!的博客 1380

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 382

算法-字符串最小变换次数

题目描述 给定两个字符串,已知可以使用三种方式进行变换 插入一个字符 删除一个字符 更改一个字符 请设计一个算法,找到两个字符串之间的经历几次最小变换,可以字符串1转换成字符串2 输入描述 输入两个字符串,字符串的长度<=1000 输出描述 最小变换次数 分析: 这道题花费的很长时间,主要还是没有想到用动态规划法,我一直考虑求出最长的非连续的公共子序列问题,有点坑。也就不解释了,看看程...

jcw的博客 3261

工程师必看:如何用功率谱密度搞定随机振动测试(附Grms计算实例)

本文为工程师详解如何通过功率谱密度(PSD)曲线计算Grms(总均方根加速度),从而量化随机振动测试的强度。文章拆解了平直谱、斜谱的计算公式,提供了完整的Grms计算实例,并指出了单位换算、对数坐标等常见工程陷阱,帮助工程师精准完成测试准备与设备推力评估。

3c4x5z6v7b的博客 625

别再调参了!用Simulink手把手教你搞定FOC电机速度环PI控制器(附模型下载)

本文详细介绍了如何使用Simulink搭建FOC电机速度环PI控制器,通过模最优准则和系统化调试方法,避免传统手动调参的繁琐过程。文章包含从传递函数推导到参数自动整定的完整流程,并提供了实战调试技巧与异常处理指南,帮助工程师快速实现电机控制系统的稳定运行。

weixin_42519985的博客 413

【算法】【递归与动态规划模块】字符串之间转换的最小代价

字符串之间转换的最小代价

qq_39760347的博客 937

扫地机的CPU只要二十多块?2024第二拆来了

昨天还说到这个机器人的故障,经小鱼拆机后测试和后台网友留言确认,不是防跌落问题,是轮子故障,这个轮子不会动,轮子上有一个限位开关检测机器人是否离开地面的,测试的时候也没有误触发,所以电机存在故障,后面拆电机的时候再检查。最后再留下一个疑问,这个机器人的回充没有用红外管,机器人是如何识别基站进行返回充电的(因为只买了本体,没买充电桩,不确定充电桩的形状,是不是利用点云识别不确定)懂的请留言。全志的R16,封装是 BGA282,那这个板子至少是4层板,小鱼盲猜 6 层板,知道的小伙伴欢迎留言。

生活不止眼前的苟且 1975

【LeetCode 每日一题】2977. 转换字符串的最小成本 II——(解法一)记忆化搜索

我们需要将 字符串转换为 字符串。转换规则是基于子串的(例如把 “abc” 转换为 “def” 花费 x 元)。 这与第一版(基于单字符)的区别在于:这个问题可以分解为三个步骤:步骤一:字符串映射与去重 (Trie)步骤二:预计算最小转换代价 (Floyd-Warshall)步骤三:动态规划求解最小总代价 (DFS + Memoization) 时空复杂度 假设:

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1349

HDOCK 蛋白蛋白对接软件使用;LZerD、pyDock、ClusPro网页在线对接

参考:hdock支持蛋白与蛋白,也支持蛋白与核酸对接计算。

weixin_42357472的博客 1万+

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1243

动态规划算法,最小代价

int tempType;                 int cost = 0;                 if (aString.charAt(i - 1) != bString.charAt(j - 1))                 {                     cost = 5;                 }

shen332401890的专栏 3056

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1383

动态规划算法:解决复杂问题的利器

动态规划(Dynamic Programming)是一种高效解决复杂问题的算法方法,它通过将问题分解为子问题,并将子问题的解缓存起来,从而避免重复计算,提高计算效率。本文将介绍动态规划算法的原理、应用场景以及实际代码示例(Java)。动态规划算法是一种强大的解决复杂问题的方法。通过将问题划分为多个子问题,并利用子问题的解来求解原问题,动态规划能够高效地解决具有重叠子问题和最优子结构特性的问题。在实际应用中,动态规划广泛应用于各个领域,例如最短路径问题、背包问题、编辑距离问题和股票交易问题等。

Java领域 1万+

luks-磁盘加密工具

linux磁盘加密配置工具及步骤详解

zdd56789的博客 120

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用动态规划算法计算字符串的编辑距离

♚作者:jclian,喜欢算法,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!编辑距离问题 什么是两个字符串的编辑距离(edit di...

Python中文社区 836

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

动态规划算法(五):编辑距离

在计算机科学中,编辑距离(Edit Distance)是一种衡量两个字符串之间相似度的算法,它通过最少的操作将一个字符串转换成另一个字符串。常见的编辑操作有:插入字符、删除字符和替换字符。编辑距离广泛应用于文本纠错、基因序列比对、语音识别等领域。在本篇文章中,我们将详细介绍编辑距离的定义、使用动态规划算法求解的原理,并通过Java代码实现具体的算法,帮助读者深入理解这一经典的动态规划问题。编辑距离是指通过插入、删除或替换字符将一个字符串转换成另一个字符串所需要的最小操作次数。

一碗黄焖鸡三碗米饭的博客 1479

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数据结构与算法 - 编辑距离问题:字符串相似度计算的DP思路

本文介绍了编辑距离(Levenshtein距离)的概念及其在字符串相似度计算中的重要性。编辑距离通过动态规划方法,计算将一个字符串转换为另一个字符串所需的最少插入、删除或替换操作次数。文中详细阐述了动态规划的状态定义、转移方程和边界条件,并提供了Java代码实现示例。此外,还通过Mermaid图表展示了状态转移过程,帮助读者直观理解这一经典算法。编辑距离广泛应用于拼写纠错、搜索引擎、DNA序列比对等领域,是衡量文本相似度的核心方法之一。文章最后总结了算法的时间复杂度为O(m×n),空间复杂度为O(m×n)。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【动态规划】最小编辑代价

空间限制:32768K 本题知识点: 动态规划  算法知识视频讲解 题目描述 对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。 给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,

聚精会神搞建设 1451

算法:编辑距离问题(动态规划)

问题描述:                  设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括(1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。 个人对问题的理解:

bensonrachel的博客 1万+

【算法入门】LeetCode 72:编辑距离 - 动态规划(Java & JavaScript)|力扣72. 编辑距离题解:Java与JavaScript动态规划详解|动态规划经典问题详解

每个状态的定义和出发边界拼写校验、基因突变等可以用滚动数组优化空间复杂度到 O(n)坚持编程练习,逐步深入,你会发现动态规划的世界其实超精彩!祝你编码顺利,算法不断突破!编辑距离问题是一个经典的动态规划问题,通过构建 DP 表,我们能够高效地计算出将一个字符串转换为另一个字符串所需的最少操作数。希望本文能帮助你更好地理解这一问题及其解决方案,掌握动态规划的基本思想是解决许多类似问题的关键。定义dp[i][j]表示将word1的前i个字符转换成word2的前j个字符所使用的最少操作数。

南北极之间 879
上一篇: 算法学习——动态规划 例题:背包问题(java)
下一篇: Server Tomcat v7.0 Server at localhost failed to start.解决办法
ArchitectDream
博客等级 码龄9年 48粉丝 288原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值