今日刷三题(day12):兑换零钱(一)+最长回文子串+编辑距离(一)

news2024/11/18 9:27:30

题目一:兑换零钱(一)

题目描述:

给定数组coins,coins中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数

输入输出描述:

输入:[5,2,3],20              返回值:4                             说明:将面值为5的货币使用4张

输入:[5,2,3],0               返回值:0                              说明:不需要任何货币都能凑够0元
输入:[3,5],2                  返回值:-1                             说明:不可能实现的情况(aim<最小货币)

题目解析:

step1:定义dp[i]表示凑够i元的最小货币数。返回值应该是dp[aim],dp数组的范围是0<=i<aim+1

step2:刚开始都设置成最大值。假设货币最小为1,凑够aim元最多需要aim张,则将dp数组全部初始化为aim+1 

step3:初始化dp[0]=0;  凑够0元需要0张

step3:遍历整个dp数组。

step4:在dp数组里再遍历coins数组

           ①当前面值coin>i,跳过continue;

           ②当前面值coin<i,   比较dp[i]和dp[i-面值]+1  大小 ,维护最小

step4:dp[aim]的值是否超过aim,如果超过说明无解,否则返回即可。

作答情况:

没有将dp数组里面的值刚开始设置为最大值,带来了很多麻烦。

其实将dp[aim]的值最开始设置为最大aim+1,到算法结束之后直接判断dp[aim]是否超过aim,如果超过说明无解,否则返回即可。

代码:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最少货币数
     * @param arr int整型一维数组 the array
     * @param aim int整型 the target
     * @return int整型
     */
    public int minMoney (int[] coins, int aim) {
        //dp[i] 表示凑够i元的最小货币数
        int[] dp = new int[aim + 1];
        //全设置为最大值
        Arrays.fill(dp, aim + 1);
        //初始化
        dp[0] = 0;
        //遍历整个数组,便于递归
        for (int i = 1; i <= aim; i++) {

            for (int coin : coins) {
                //当前面值>目标钱数,   不考虑,走下一个
                if (coin > i ) continue;
                //当前面值< 目标钱数,  递归,并维护最小值
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }
        //dp[aim]的值是否超过aim,如果超过说明无解,否则返回即可。
        return dp[aim] == aim + 1 ? -1 : dp[aim];
    }
}

题目二:最长回文子串

题目描述:

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。

输入输出描述:

输入:"ababc"                   返回值:3
说明:最长的回文子串为"aba"与"bab",长度都为3
输入:"abbba"                  返回值:5
说明:最长的回文子串为"abbba",长度为3
输入:"b"                           返回值:1

题目解析:

step1:dp[i][j]为判断从i到j是不是回文子串,设置返回值为boolean类型的

step2:初始化结果result为1(每个字符至少是自己的回文子串,初始化长度为1)

step3:初始化dp数组(遍历数组,每个字符至少是自己的回文子串,dp[i][i]为true)

step4:设置右边界i从第二个元素开始遍历,左边界j范围为0至i-1。

step5:i下标对应的元素==j下表对应的元素,并且元素相邻或者i+1到j-1是回文子串(继续dp),返回true,并且在判定回文子串是true时立即更新最大值。

作答情况:

result更新值时写到了if语句外面。

代码:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @return int整型
     */
    public int getLongestPalindrome (String str) {
        int m=str.length();
        //每个字符至少是自己的回文子串
        int result=1;
        //dp[i][j]表示字符串从i到j是回文子串
        boolean[][] dp=new boolean[m][m];
        for(int i=0;i<m;i++){
            //每个字符都是自己的回文子串
           dp[i][i]=true;
        }
        //从第二个元素开始,规定字符串的范围
          for(int j=1;j<m;j++){
            for(int i=j-1;i>=0;i--){
                //j为最右边,i为最左边
                //i下标对应的元素==j下表对应的元素并且元素相邻或者i+1到j-1是回文子串,返回true,并且保存最长值
                if(str.charAt(i)==str.charAt(j)&&(j-i==1||dp[i+1][j-1])){
                    dp[i][j]=true;
                    result=Math.max(result,j-i+1);
                }
            }
          }
        return  result;
    }
}

题目二:编辑距离(一)

题目描述:

给定两个字符串 str1 和 str2 ,请你算出将 str1 转为 str2 的最少操作数。

你可以对字符串进行3种操作:

1.插入一个字符

2.删除一个字符

3.修改一个字符。

字符串长度满足 1≤n≤1000  ,保证字符串中只出现小写英文字母。

输入输出描述:

输入:"nowcoder","new"          返回值:6

说明:"nowcoder"=>"newcoder"(将'o'替换为'e'),修改操作1次
           "nowcoder"=>"new"(删除"coder"),删除操作5次    

 
输入:"intention","execution"     返回值:5
说明:因为2个长度都是9,后面的4个后缀的长度都为"tion",于是从"inten"到"execu"逐个修改


输入:"now","nowcoder"         返回值:5

说明:逐个删除“coder”

题目解析:

step1:dp[i][j]表示str1的前i个字符转化为str2的前j个字符的最小操作数,设置dp数组的大小一定要大于str1和  str2的长度。

step2:特殊情况判定

           ①str1为空字符串,dp[0][j]=j  (将str1插入str2的前j个所有字符要进行j次)

            ②str2为空字符串,dp[i][0]=i  (将str1转化为空字符串要进行i次删除操作)

step3:dp从各自从第1个字符开始,规定dp第一个下标为1,循环遍历两个str字符串

step4:判定当前字符是否相等

            ①当前字符相等(不用操作),递归到前i-1个字符转化为前j-1个字符最小操作数,即

               dp[i][j]=dp[i-1][j-1];

            ②当前字符不相等(需要根据情况操作)

               例如pre->er
              插入:pre->e (e)   pre的前3个字符转化为er的前1个字符,得到e,再插入r(1次操作)
              删除:pr->er(ere) pre的前2个字符转化为er的前2个字符,得到ere,再删除e(1次操作)
              修改:pr->e(ee) pre的前2个字符转化为er的前1个字符,得到ee,再修改e为r(1次操作)

step5:最后比较这三种操作,维护最小值

作答情况:

通过测试用例。

①当前字符不相等的情况,如果没有思路,可以经过举例来思考;

②三个元素比较大小,一定是两两比较,Math函数只能存两个结果值进行比较。

代码:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str1 string字符串 
     * @param str2 string字符串 
     * @return int整型
     */
    public int editDistance (String str1, String str2) {
        //dp[i][j] 将str1的前i个字符转化为str2的前j个字符
        int m=str1.length();
        int n=str2.length();
        int[][] dp=new int[m+1][n+1];
        for(int i=0;i<=m;i++){
            dp[i][0]=i;
        }
        for(int j=0;j<=n;j++){
            dp[0][j]=j;
        }
        //dp从各自从第1个字符开始
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                //dp中下标从1开始,str下标从0开始
         //当前字符相等(不用操作),递归到前i-1个字符转化为前j-1个字符最小操作数
                if(str1.charAt(i-1)==str2.charAt(j-1)) dp[i][j]=dp[i-1][j-1];
                //当前字符不相等(需要根据情况操作)
                else{
//例如pre->er
 //插入:pre->e (e)   pre的前3个字符转化为er的前1个字符,得到e,再插入r(1次操作)
 //删除:pr->er(ere) pre的前2个字符转化为er的前2个字符,得到ere,再删除e(1次操作)
 //修改:pr->e(ee) pre的前2个字符转化为er的前1个字符,得到ee,再修改e为r(1次操作)

 //最后比较这三种操作,维护最小值
                    dp[i][j]=Math.min(dp[i][j-1],
                    Math.min(dp[i-1][j],dp[i-1][j-1])
                    )+1;
                }
            }
        }
        return dp[m][n];
    }
}

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

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

相关文章

代码随想录算法训练营DAY47|C++动态规划Part8|198.打家劫舍、213.打家劫舍II、198.打家劫舍III

文章目录 198.打家劫舍思路CPP代码 ⭐️213.打家劫舍II解决环的问题思路总结CPP代码 ⭐️198.打家劫舍III思路递归三部曲——确定参数和返回值递归三部曲——确定终止条件递归三部曲——确定单层遍历的逻辑 打印dp数组CPP代码暴力递归记忆化递归 198.打家劫舍 力扣题目链接 文章…

安卓开发--按键跳转页面,按键按下变色

前面已经介绍了一个空白按键工程的建立以及响应方式&#xff0c;可以参考这里&#xff1a;安卓开发–新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应。 安卓开发是页面跳转是基础&#xff01;&#xff01;&#xff01;所以本篇博客介绍利用按键实现页面跳转&#…

【C++】STL-list的使用

目录 1、list的使用 1.1 list的构造 1.2 list的遍历 1.3 list capacity 1.4 list element access 1.5 容量相关 list是一个带头双向循环链表 1、list的使用 1.1 list的构造 1.2 list的遍历 list只有两种遍历方式&#xff0c;因为没有operator[] 因为list的双向链表&am…

初识C语言——第十六天

C语言中的语句结构类型:顺序/选择/循环 分支语句 if else switch 循环语句 while for do whlie goto语句 代码练习:找两个整数的最大公约数和最小公倍数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>//int main() //{ // int age 60; // if (ag…

景源畅信数字:抖音小店的入住门槛大不大?

近年来&#xff0c;随着短视频平台的崛起&#xff0c;抖音小店逐渐成为了众多商家和创业者关注的焦点。那么&#xff0c;抖音小店的入住门槛究竟大不大呢?本文将从四个方面对这一问题进行详细阐述。 一、注册流程 抖音小店的注册流程相对简单&#xff0c;只需按照官方指引完成…

漫威争锋Marvel Rivals申请测试资格教程 最新获取测试资格教程

即将震撼登场的《漫威争锋》&#xff08;Marvel Rivals&#xff09;标志着PvP射击游戏领域的全新突破&#xff0c;由漫威官方网站全力支持推出。这款游戏定于5月11日早晨9点启幕其封闭Alpha测试章节&#xff0c;这场测试盛宴将持续整整十天。在首波测试浪潮中&#xff0c;玩家有…

以目录创建的conda环境添加到jupyter的kernel中

场景&#xff1a;由于某些原因&#xff0c;服务器上的conda环境不能通过--name的方式创建&#xff0c;只能通过指定目录即-p的方式&#xff0c;在这种情况下该环境在conda env list中没有显示&#xff0c;无法在jupyter kernel中搜到&#xff0c;只能手动添加。 1.进入环境 # …

百面算法工程师 | 模型评价指标及优化策略

本文给大家带来的百面算法工程师是深度学习模型评价指标的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的评价方案&#xff0c;并提供参考的回答及其理论基础&…

扩散模型~

推荐&#xff1a;write_own_pipeline.ipynb - Colab (google.com) 基本管道 一直显示NVIDIA有问题&#xff0c;所以就把.to("cuda")去掉了&#xff0c;使用Colab运行的&#xff0c;代码如下&#xff1a; from diffusers import DDPMPipelineddpm DDPMPipeline.fr…

【有趣的透镜】1.透镜初相识

1.透镜的外形和材料 (1)透镜由玻璃或者塑料制成&#xff1b; (2)透镜一般为圆型&#xff0c;其单面或双面为球面&#xff1b; 2.透镜的类型和折射 (1)球面外凸为凸透镜(聚光)&#xff0c;球面内凹为凹透镜(散光)&#xff1b; (2)透镜是基于光的折射&#xff0c;只要光从一…

【api接口开通教程】YouTube Data API v3申请流程

一、背景调查 1.1 API接口介绍 采集youtube数据&#xff0c;大体分为两种方案&#xff1a;一种是基于爬虫&#xff0c;一种是基于API接口。 说人话就是&#xff1a;爬虫相当于走后门、爬窗户&#xff08;利用技术手段窃取&#xff0c;人家没说给&#xff0c;但我硬拿&#x…

兔子繁衍问题<C语言>

问题&#xff1a;一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死&#xff0c;请问第1个月出生的一对兔子&#xff0c;至少需要繁衍到第几个月时兔子总数才可以达到N对&#xff1f; 分析&#xff1a; 可以观…

学习记录:AUTOSAR R20-11的阅读记录(三)【CP(5.1-5.5)】

接上回&#xff1a;学习记录&#xff1a;AUTOSAR R20-11的阅读记录&#xff08;二&#xff09;【AP】 五、CP 在AUTOSAR_TR_ClassicPlatformReleaseOverview.pdf里面对CP文档进行分类&#xff1a; Release DocumentationCommunicationMemorySystem ServicesMCALIOLibrariesDi…

这 7 道 Redis 基础问题,很常见!!

后端项目如果用到分布式缓存的话&#xff0c;一般用的都是 Redis。不过&#xff0c;Redis 不仅仅能做缓存&#xff0c;还能用作分布式锁、延时队列、限流等等。 什么是 Redis&#xff1f; Redis[1] &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的…

数据治理的难题:如何化解?

在数字化转型的大潮中&#xff0c;数据治理成了每个企业都绕不开的话题。但是&#xff0c;数据治理这条路并不好走&#xff0c;充满了各种挑战。这些挑战不仅来自于技术&#xff0c;还有组织文化、流程和法律法规等方面。 挑战一&#xff1a;数据孤岛 在企业内部&#xff0c;…

ORA-02020:过多的数据库链接在使用

一、问题描述 今天同事说&#xff0c;有一个查询功能&#xff0c;同时查了几个子平台的dblink&#xff0c;页面返回报错。 提示ORA-02020&#xff1a;过多的数据库链接在使用&#xff1b; bad SQL grammar 二、解决办法 1&#xff09;分析业务需求 分析业务场景 &#xff0c;发…

【勘误】一个错误的快速排序实现

文章目录 问题一&#xff1a;不一致算法描述部分给出的分划实现完整程序部分给出的分划实现 问题二&#xff1a;不正确问题三&#xff1a;把循环条件改为 i < j 程序还是不正确正确的实现总结 从 10 10 10 年前我开始学 C 语言时我就认为快速排序并不是个简单的算法。相比于…

哈迪斯2发售时间 哈迪斯游戏攻略 苹果电脑怎么玩《哈迪斯2》

这两年肉鸽游戏大爆发&#xff0c;只要不是美女抽卡养成那基本上就是肉鸽了&#xff0c;但是真正让玩家口服心服的肉鸽游戏不多&#xff0c;《哈迪斯》绝对算是其中一款。 近日让玩家期待已久的肉鸽大作&#xff0c;晶体管工作室制作的《哈迪斯》正统续作《哈迪斯2》终于开卖了…

3.ERC4626

ERC4626是一个vault&#xff0c;在DAI中&#xff0c;使用ETH换取DAI。其流程为先充值ETH到maker vault。 Vault 资产的管理、分红用户充值某项资产获取某个凭证该凭证作为分红、推出的依据Yield Farming/借贷/质押等 以太坊改进提案EIP:ethereum improvemwnt proposal 最初E…

大数据面试题 —— 数据库

目录 关系型数据库与非关系型数据库的区别数据库三范式MySQL中 drop、delete、truncate的区别MySQL中 char和 varchar 的区别MySQL中inner join、left join、right join以及full join的区别MySQL中 having 和 where 的区别count(*)、count(1)、count(列名)的区别MySQL中视图和表…