字符串-将str1编辑成str2所需最小代价(hard)

2024-06-03 02:52

本文主要是介绍字符串-将str1编辑成str2所需最小代价(hard),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

二、解题思路

该题目使用动态规划的思想来解决问题

刚开始我还在想,删除+添加的操作可以等价为替换操作,如果替换操作的Cost大于删除+添加组合操作的Cost之和就需要把 rc=dc+ic。

但是在动态规划中,如果对三种不同的操作方式进行比较然后取较小值,不用进行上面的替换操作就可以达到效果,假设i表示指向str2的指针,j表示指向str1的指针,将str1->str2的过程中

        无非就是一个从对角线 [i-1][j-1] ->(替换) [i][j]           cost=rc

        另一个从 [i-1][j-1] ->(删除) [i-1][j] ->(添加) [i][j]         cost=dc+ic

所以这里的状态转移方程就是:

        deleteCost      =   dp[i][j-1]+dc;

        addCost          =   dp[i-1][j]+ic;

        replaceCost    =   dp[i-1][j-1]+rc;

        dp[i][j]             =   Min(deleteCost,addCost,replaceCost)

初始化dp数组

        dp[0][j] = j*dc        :代表str2为空串,str1只能删除,则花费为 j × dc

        dp[i][0] = i*ic         :代表str1为空串,str1只能添加,则花费为 i × ic        

        

三、代码实现

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** min edit cost* @param str1 string字符串 the string* @param str2 string字符串 the string* @param ic int整型 insert cost* @param dc int整型 delete cost* @param rc int整型 replace cost* @return int整型*/public int minEditCost (String str1, String str2, int ic, int dc, int rc) {//使用动态规划找两个字符串的最小代价int[][] maxCostArr=new int[str2.length()+1][str1.length()+1];//dp数组进行初始化//初始化第一行,当str2为空字符串时for(int i=0;i<=str1.length();i++){maxCostArr[0][i]=i*dc;}//初始化第一列,当str1为空字符串时for(int i=0;i<=str2.length();i++){maxCostArr[i][0]=i*ic;}//双层循环对dp数组进行修改for(int p2=1;p2<=str2.length();p2++){for(int p1=1;p1<=str1.length();p1++){if(str2.charAt(p2-1)==str1.charAt(p1-1)){//Cost不需要增加maxCostArr[p2][p1]=maxCostArr[p2-1][p1-1];}else{//计算三种情况下的代价值,去最小值int deleteCost=maxCostArr[p2][p1-1]+dc;int addCost=maxCostArr[p2-1][p1]+ic;int replaceCost=maxCostArr[p2-1][p1-1]+rc;maxCostArr[p2][p1]=Math.min(deleteCost,Math.min(addCost,replaceCost));}}}return maxCostArr[str2.length()][str1.length()];}
}

四、刷题链接

编辑距离(二)_牛客题霸_牛客网

这篇关于字符串-将str1编辑成str2所需最小代价(hard)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025831

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字