leetcode514. 自由之路(java)

news2024/12/26 11:48:39

自由之路

  • leetcode514. 自由之路
    • 题目描述
    • 解题思路
      • 代码演示
  • 动态规划专题

leetcode514. 自由之路

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/freedom-trail

题目描述

电子游戏“辐射4”中,任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘,并使用表盘拼写特定关键词才能开门。
给定一个字符串 ring ,表示刻在外环上的编码;给定另一个字符串 key ,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。
最初,ring 的第一个字符与 12:00 方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。

旋转 ring 拼出 key 字符 key[i] 的阶段中:
您可以将 ring 顺时针或逆时针旋转 一个位置 ,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key[i] 。
如果字符 key[i] 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。

示例1:
在这里插入图片描述
输入: ring = “godding”, key = “gd”
输出: 4
解释:
对于 key 的第一个字符 ‘g’,已经在正确的位置, 我们只需要1步来拼写这个字符。
对于 key 的第二个字符 ‘d’,我们需要逆时针旋转 ring “godding” 2步使它变成 “ddinggo”。
当然, 我们还需要1步进行拼写。
因此最终的输出是 4。

示例 2:
输入: ring = “godding”, key = “godding”
输出: 13

提示:
1 <= ring.length, key.length <= 100
ring 和 key 只包含小写英文字母
保证 字符串 key 一定可以由字符串 ring 旋转拼出

解题思路

这道题虽然是hard 难度的,但如果是递归暴力穷举的话,其实思路还是很简单的,每次需要转动一个字符时,就去递归走顺时针还是逆时针,然后求出整体最小值,就可以了/

可能在处理圆盘每次在转动时,顺时针逆时针每次需要转动几次,转动后的状态如何保存,才是思考的点,关于这个,我们可以用一个map集合,把每个字符所在的位置都记录下来,字符对应下标的位置都标记好,然后,每次通过字符去查找对应的下标,就知道需要转动几次了。下面代码演示.

代码演示

    //字符和位置的映射
    HashMap<Character, List<Integer>> charMap = new HashMap<>();
   //缓存
    int[][]memo;

    /**
     * 最少操作次数
     * @param ring
     * @param key
     * @return
     */
    public int findRotateSteps(String ring, String key) {
        int m = ring.length();
        int n = key.length();
        memo = new int[m][n];
        //将字符和位置形成对应关系
        for (int i = 0;i < m;i++){
            if (!charMap.containsKey(ring.charAt(i))){
                charMap.put(ring.charAt(i),new LinkedList<Integer>());
            }
            charMap.get(ring.charAt(i)).add(i);
        }
        return process(ring,0,key,0);
    }

    /**
     * 暴力递归 + 缓存
     * @param ring 转盘
     * @param r 指针当前指的位置
     * @param key 密码
     * @param k 当前要输的字符
     * @return
     */
    public int process(String ring,int r,String key,int k){
        //base case 完成输入
        if (k == key.length()){
            //不需要再转了,返回0
            return 0;
        }
        //缓存减少重复计算
        if (memo[r][k] != 0){
            return memo[r][k];
        }
        int n = ring.length();
        int res = Integer.MAX_VALUE;
        //在ring 里可能有重复的字符,因此index 可能有好几个值,通过遍历的方式,去每个位置都做计算
        //求出最终的最小值,方法很暴力,
        for (int index : charMap.get(key.charAt(k))){
            //需要输入的字符和指针所指的字符夫人距离
            int step = Math.abs(index - r);
            //选择顺时针还是逆时针拨动,选择操作次数最少的.
            step = Math.min(step,n - step);
            //将指针拨当前需要输入的字符位置,再进行下一次拨动,记录下一次拨动需要的操作的次数
            int nextStep = process(ring, index, key, k + 1);
            //要选择整体操作最少次数的
            //额外要加1,按确认也是一次操作
            res = Math.min(res,1 + step + nextStep);
        }
        memo[r][k] = res;
        return res;
    }

动态规划专题

leetcode887. 鸡蛋掉落

leetcode1884. 鸡蛋掉落-两枚鸡蛋

leetcode72. 编辑距离

leetcode312. 戳气球

leetcode63. 不同路径 II

leetcode62. 不同路径

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

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

相关文章

深入浅出设计模式 - 工厂模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; ​ &#x1f495;&#x1f495; 感兴趣的同学可…

目标检测舰船数据集整合

一、光学数据集 1、 DIOR 数据集(已下载yolo版本)&#xff08;论文中提到过&#xff09; “DIOR”是一个用于光学遥感图像目标检测的大规模基准数据集。数据集包含23463个图像和192472个实例&#xff0c;涵盖20个对象类。这20个对象类是飞机、机场、棒球场、篮球场、桥梁、烟囱…

CSS 边框盒子

文章目录 边框盒子 边框盒子 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 默认的盒子类型是内容盒子&#xff1a;content-box 在内容盒子中&#xff0c;width和height是内容尺寸 盒子整体的尺寸内容的尺寸两个边框两个内边距 css3引入了新的盒子类型&…

Linux——对动静态库的优缺点和底层剖析对比

目录 静态库底层剖析&#xff1a; 所以静态库的优缺点总结&#xff1a; 动态库底层剖析&#xff1a; 所以使用动态库的优缺点剖析&#xff1a; 静态库底层剖析&#xff1a; 如上图&#xff1a;file1.exe被加载到了内存&#xff0c;成为了进程&#xff0c;因为代码中都有pri…

【Docker】docker安装配置Jenkins

docker 安装 Jenkins #拉镜像 docker pull jenkins/jenkins#创建卷(volume) docker volume create jenkins_home#制作容器并启动 docker run -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ -v /usr/lib/jvm/java-8-openjdk-amd64:/usr/local/java…

IMX6ULL系统移植篇-镜像烧写方法

一. 烧录镜像简介 本文我们就来学习&#xff1a;windows 系统下烧录镜像的方法。 如何使用 NXP 官方提供的 MfgTool 工具通过 USB OTG 口来 烧写系统。 二. windows下烧录镜像 1. 烧录镜像前准备工作 &#xff08;1&#xff09;从开发板上拔下 SD卡。 &#xff08;2…

SpringBoot中如何优雅的统一全局返回格式与处理系统异常?

在领域驱动设计&#xff08;DDD&#xff09;中&#xff0c;接口层主要负责处理与外部系统的交互&#xff0c;包括接收用户或外部系统的请求&#xff0c;调用应用层服务处理请求&#xff0c;以及将处理结果返回给请求方。 我发现一些代码中&#xff0c;接口的返回值类型众多&am…

chatgpt赋能python:Python语言单词大全:从入门到精通

Python语言单词大全&#xff1a;从入门到精通 Python是一种高级编程语言&#xff0c;适用于各种应用领域&#xff0c;如数据科学、机器学习、网站开发和自动化脚本编写等。Python语言有其内置的语法和功能&#xff0c;我们将在本文中逐一介绍和解释。 1. Python中最基本的单词…

K8S集群安全之安全机制

1. 安全机制说明&#xff1a; Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介&#xff0c;也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护APIServer来设计的。Kubernetes使…

小程序实现双列布局

目录 1 双列布局2 采用流式布局3 采用网格布局总结 小程序中双列布局是一个常见的效果&#xff0c;比如在电商小程序的商品推荐&#xff0c;效果如下&#xff1a; 1 双列布局 双列布局的话特点是随着数据的增多&#xff0c;我们会出现偶数或者奇数的问题&#xff0c;如果是偶…

【Data Studio 2.1.0连接openGauss2.1.0】

Data Studio 2.1.0连接openGauss2.1.0 一、实验环境说明二、配置客户端接入方式三、Data Studio2.1.0连接openGauss数据库 一、实验环境说明 openGauss2.1.0版本Data Studio 2.1.0 版本 二、配置客户端接入方式 【以下操作是omm用户进行】 修改配置文件pg_hba.conf&#xf…

12--Gradle进阶 - Gradle任务的类型

12--Gradle进阶 - Gradle任务的类型 任务类型 前面我们定义的task 都是DefaultTask 类型的,如果要完成某些具体的操作完全需要我们自己去编写gradle 脚本&#xff0c;势必有些麻烦&#xff0c;那有没有一些现成的任务类型可以使用呢&#xff1f;有的&#xff0c;Gradle 官网给出…

C. Tenzing and Balls - dp

分析&#xff1a; 补题。当时不明白的点是如何快速查询相同元素的下标&#xff0c;可以用last[a[i]]表示与a[i]相同的最近的一个数的下标&#xff0c;可以遍历数组的同时实现下标的查询和变化&#xff0c;不断通过遍历来更新last[a[i]]的值&#xff0c;即last[a[i]]i。 然后是状…

衡石bi的几种跳转方式

衡石bi的几种跳转方式 通过点击表格的单元格跳转(带参) 点击首页的表格里任意一行的单元格跳转到明细页的企业相关数据 这两个数据集都是有一个info_uuid的主键&#xff0c;我们知道每个控件都可以设置交互的方式进行跳转应用内的仪表盘。 点击首页里要设置跳转的控件右上角的…

maven基础教程

一、安装moven 1、下载maven包 首先到maven官网下载安装包&#xff0c;解压到本地目录&#xff0c;然后配置环境变量。 maven下载地址&#xff1a;https://maven.apache.org/download.cgi 2、配置环境变量 然后打开环境变量&#xff0c;添加 MAVEN_HOME 系统变量&#xff…

JVM-jvisualvm性能监控可视化工具使用与eden-s0-s1分配分析

目录 第一步&#xff1a;安装jvisualvm 第二步&#xff1a;安装VisualvmGc插件 方式一&#xff1a;jvisualvm工具直接下载安装 方式二&#xff1a;去官网下载导入安装 总结 第三步&#xff1a;idea安装VisualvM Launcher插件 第四步&#xff1a;演示young中eden、s0、s1垃…

轻量级数据交换格式:jsoncpp

"这不属于我&#xff0c;因为沉默背后&#xff0c;也有冲动" 一、认识json (1) 为什么有那么多的数据交换格式&#xff1f; 比如说&#xff0c;现在我有下面的数据: #include <iostream> #include <string>int main() {std::string name "张三&q…

比较两个突出的node.js框架:koa和express

目录 一、Koa 和 Express 的介绍 二、Koa 和 Express 的区别 1.异步编程方式不同 2.错误处理方式不同 三、Koa 和 Express 的优缺点 1.Express 的优点 2.Express 的缺点 3.Koa 的优点 4.Koa 的缺点 总结 接上文讲述了 koa框架&#xff0c;这边文章比较一下这两个突出…

CentOS系统忘记密码了改怎么修改重置103.88.34.X

首先&#xff0c;打开centos7&#xff0c; 在正常系统入口按↑和↓"e"&#xff0c;会进入edit模式 然后找到以“Linux16”开头的行&#xff0c;在该行的最后面输入“init/bin/sh” 按下ctrlx组合键来启动系统 接下来再输入“mount -o remount,rw /”(注意mount与…

ceph对象存储使用总结

ceph对象存储使用总结 大纲 基础概念安装对象存储网关RADOS网关配置对象存储网关RADOS网关修改RADOS网关端口修改支持https访问RADOS网关使用s3cmd操作对象存储Ceph dashboard管理RADOS网关使用java程序操作对象存储 基础准备 操作系统 ubuntu~18.04ceph版本 Octopus v15.2…