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

题目一:兑换零钱(一)

题目描述:

给定数组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];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单位圆内的正交向量多项式,第一部分:由Zernike多项式的梯度导出的基组

clear all; close all; clc; %% I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存\image\imgs\right\0.bmp)); I2=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.法\image\imgs\right\1.bmp)); I3=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.p\image\imgs…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

实在Agent智能体:引领智能自动化新纪元

在数字化转型的浪潮中&#xff0c;实在智能科技有限公司凭借其前沿技术&#xff0c;推出了实在Agent智能体——一款革命性的超自动化智能体。它不仅代表了人工智能技术的新高度&#xff0c;更预示着未来工作方式的变革。 什么是实在Agent智能体&#xff1f; 实在Agent智能体是…

《Fundamentals of Power Electronics》——状态空间平均法

文献中出现了许多交流变换器建模技术&#xff0c;包括电流注入法、电路平均法和状态空间平均法。尽管给定方法的支持者可能更喜欢用特定形式表示最终结果&#xff0c;但几乎所有方法的最终结果都是等效的。所有人都会赞同&#xff0c;平均和小信号线性化是PWM变换器建模的关键步…

云动态摘要 2024-05-06

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

用得助全媒体呼叫中心,让AI落到实处帮品牌做营销

怎么让人工智能落到实处的帮助到我们&#xff1f;我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌&#xff0c;该品牌在中国功能性护肤品市场占有率达到20.5%&#xff0c;这么高的市场占有率客户的咨询量也是非常庞大的&#xff0…

MAC M1 配置 Git SSH

背景 换了新笔记本&#xff0c;本地想要克隆github 上的项目需要配置ssh 公钥到自己的github账户中&#xff0c;否则使用ssh 地址克隆会报错&#xff0c;如下。 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.操作 1. 生成s…

探索大型语言模型(LLM)的世界

​ 引言 大型语言模型&#xff08;LLM&#xff09;作为人工智能领域的前沿技术&#xff0c;正在重塑我们与机器的交流方式&#xff0c;在医疗、金融、技术等多个行业领域中发挥着重要作用。本文将从技术角度深入分析LLM的工作原理&#xff0c;探讨其在不同领域的应用&#xff0…

安卓使用Fiddler抓包 2024

简介 最近试了一下安卓使用fiddler 抓包&#xff0c;发现https包基本都会丢失。原因是Anandroid 7版本针对ssl安全性做了加强&#xff0c;不认可用户的证书。我们要做的就是把fiddler导出的证书进过处理后放置到系统证书目录下面&#xff0c;这样才能抓包https请求。 这里使用…

【Anaconda】升级Anaconda Navigator提示JSONDecoderError,删除.condarc文件后搞定

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、报错&#xff1a;JSONDecoderError二、错误原因三、解决问题总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 时间长未升级Ana…

AI 绘画神器 Fooocus 本地部署指南:简介、硬件要求、部署步骤、界面介绍

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 随着人工智能技术的飞速发展&#xff0c;AI 绘画逐渐成为创意领域的新宠。Fooocus 作为一款免费开源的 AI 绘画工具&am…

窜货溯源采买的目的

当品牌遇到窜货时&#xff0c;不管是线上还是线下渠道&#xff0c;快速的治理方法&#xff0c;就是找到窜货源头&#xff0c;对源头进行打击&#xff0c;这里面有一步很关键的操作便是买货&#xff0c;将货品买回后做溯源&#xff0c;通过产品本身或者外包装上的条码&#xff0…

【Java orm 框架比较】十 新增hammer_sql_db 框架对比

迁移到&#xff08;https://gitee.com/wujiawei1207537021/spring-orm-integration-compare&#xff09; orm框架使用性能比较 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db 操作数据 …

[uniapp 地图组件] 小坑:translateMarker的回调函数,会调用2次

大概率是因为旋转和移动是两个动画&#xff0c;动画结束后都会分别调用此函数 即使你配置了 【不旋转】它还是会调用两次&#xff0c; 所以此处应该是官方的bug

未来娱乐新地标?气膜球幕影院的多维体验—轻空间

在中国&#xff0c;一座独特的娱乐场所正在崭露头角&#xff1a;气膜球幕影院。这个融合了气膜建筑与激光投影技术的创新场所&#xff0c;不仅令人惊叹&#xff0c;更带来了前所未有的科幻娱乐体验。让我们一起探索这个未来的娱乐空间&#xff0c;感受其中的多维魅力。 现场演出…

Linux(openEuler、CentOS8)企业内网DHCP服务器搭建(固定Mac获取指定IP)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文&#xff09;---- 目录 一、知识点二、实验&#xff08;一&#xff09;为服务器配置网卡和IP&#xff08;二&#xff09;为服务器安装DHCP服务软件&#xff08;三&a…

DenseCLIP论文讲解

文章目录 简介方法总体框架 &#xff08;Language-Guided Dense Prediction&#xff09;上下文感知提示 &#xff08;Context-Aware Prompting&#xff09;应用实例 论文&#xff1a;DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting 代码&#xff1…

Python3实现三菱PLC串口通讯(附源码和运行图)

基于PyQt5通过串口通信控制三菱PLC 废话不多说&#xff0c;直接上源码 """ # -*- coding:utf-8 -*- Project : Mitsubishi File : Main_Run.pyw Author : Administrator Time : 2024/05/09 下午 04:10 Description : PyQt5界面主逻辑 Software:PyCharm "…

一个注解完美实现分布式锁(AOP)

前言 学习过Spring的小伙伴都知道AOP的强大&#xff0c;本文将通过Redisson结合AOP&#xff0c;仅需一个注解就能实现分布式锁。 &#x1f36d; 不会使用aop和redisson的小伙伴可以参考&#xff1a; 【学习总结】使Aop实现自定义日志注解-CSDN博客 【学习总结】使用分布式锁和…

Vulstack红队评估(一)

文章目录 一、环境搭建1、网络拓扑2、web服务器(win7)配置3、域控&#xff08;winserver2008&#xff09;配置4、域内机器&#xff08;windows 2003&#xff09;配置5、调试网络是否通常 二、web渗透1、信息搜集2、端口扫描3、目录扫描4、弱口令5、phpmyadmin getshell日志gets…