每日一题 力扣514自由之路

514. 自由之路

题目描述:

电子游戏“辐射4”中,任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘,并使用表盘拼写特定关键词才能开门。

给定一个字符串 ring ,表示刻在外环上的编码;给定另一个字符串 key ,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。

最初,ring 的第一个字符与 12:00 方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。

旋转 ring 拼出 key 字符 key[i] 的阶段中:

  1. 您可以将 ring 顺时针或逆时针旋转 一个位置 ,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key[i] 。
  2. 如果字符 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 旋转拼出

思路:

动态规划,大神思路在代码区!

代码:

cv 的大佬Ikaruga的代码:

class Solution {
public:int findRotateSteps(string ring, string key) {vector<int> pos[26];//记录ring里每个字符都在哪 godding里是 g在 0 6, d在 2 3for (int i = 0; i < ring.size(); i++) {pos[ring[i] - 'a'].push_back(i);}vector<vector<int>> dp(key.size(), vector<int>(ring.size(), INT_MAX));//dp[i][j]的定义: 在匹配key中第i个字母的时候,使用ring中第j个位置,所需要的操作。for (int i = 0; i < key.size(); i++) {for (auto j : pos[key[i] - 'a']) {//j是key[i] 在环内的位置if (i == 0) {//key的第一个字母, 不需要考虑任何前面的次数//只需要计算 指针从0 转到 j 的操作次数 再加上 1 , 选择当前, 就是总操作数dp[i][j] = min(dp[i][j], 0 + clac(ring.size(), 0, j) + 1);continue;}//当i非0的时候, 需要看一下之前字母的操作次数//k 就是前一个字母的位置for (auto k : pos[key[i - 1] - 'a']) {//非第一个的字母, 需要看一下从前面的字母,怎么转移来是操作数最小的。//比如那个老哥给的例子,dp[0][1] = 2, dp[0][8] = 3,//然后匹配第二个字母的时候,dp[1][3] = min(dp[0][1] + 从1转到3 + 1, dp[0][8] + 从 8 转到3 + 1)dp[i][j] = min(dp[i][j], dp[i - 1][k] + clac(ring.size(), k, j) + 1);}}}return *min_element(dp.back().begin(), dp.back().end());}//计算从 指针在a 到 字母所在位置b 最少需要转多少次int clac(int len, int a, int b) {return min((len + a - b) % len, (len + b - a) % len);}
};

参考循环队列的出入队,以及求队长的操作,可以得到从某一位置到另一位置的最近步数:
min((len + a - b) % len, (len + b - a) % len);

再来一个Python:

class Solution:def findRotateSteps(self, ring: str, key: str) -> int:#先用一个哈希表存放ring中各个字母的索引hs = dict()for i in range(len(ring)):if ring[i] not in hs:hs[ring[i]] = [i]else:hs[ring[i]].append(i)#初始化dp数组,包括初始化第一行m,n = len(ring),len(key)dp = [float('inf')]*mfor q in hs[key[0]]:dp[q] = min(q,m-q)+1for i in range(1,n):#分为两种情况:1.正在处理的字母与上一个字母不同;2.正在处理的字母与上一个字母相同;if key[i]!=key[i-1]:for p in hs[key[i-1]]:for j in hs[key[i]]:dp[j] = min(dp[j],min(abs(j-p),m-abs(j-p))+dp[p]+1)dp[p] = float('inf')else:for j in hs[key[i]]:# tmp = float('inf')# for p in hs[key[i-1]]:#     tmp = min(tmp,min(abs(j-p),m-abs(j-p))+dp[p]+1)# dp[j] = tmpdp[j]+=1return min(dp)

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

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

相关文章

WhisperBot:整合了Mistral大型语言模型的实时语音转文本系统

项目简介 欢迎来到 WhisperBot。WhisperBot 基于 WhisperLive 和 WhisperSpeech 的功能而构建&#xff0c;在实时语音到文本管道之上集成了大型语言模型 Mistral (LLM)。WhisperLive 依赖于 OpenAI Whisper&#xff0c;这是一个强大的自动语音识别 (ASR) 系统。Mistral 和 Whi…

企业中不同大数据迁移的区别是什么?

在大数据时代&#xff0c;企业面临着海量数据的管理、分析和应用挑战。为了克服数据存储、传输和处理中的难题&#xff0c;如数据量巨大、网络环境多变、存储成本高昂以及安全风险上升等&#xff0c;企业必须对数据进行备份、同步、分发或归档。这一过程中&#xff0c;数据的复…

STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

目录 1、准备材料 2、实验目标 3、模拟鼠标实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、设初始化调用流程 3.2.2、外设中…

【C++】输入输出、缺省参数、函数重载

目录 C的输入和输出 缺省参数 概念 缺省参数的分类 全缺省参数 半缺省参数 函数重载 概念 C支持函数重载的原理--名字修饰 C的输入和输出 #include<iostream> // std是C标准库的命名空间名&#xff0c;C将标准库的定义实现都放到这个命名空间中 using namespace …

python基础之ORM操作Mysql数据库

首先简单介绍下SQLalchemy库和sqlacodegen库。 SQLalchemy 库是一个流行的 Python 数据库工具&#xff0c;用于与各种关系型数据库进行交互。它提供了一个统一的 API&#xff0c;使得开发人员可以使用相同的代码来操作不同的数据库&#xff0c;而无需关心数据库的具体细节。 …

【笔记】Helm-4 最佳实践-8 基于角色的访问控制

基于角色的访问控制 最佳实践的这部分讨论在chart清单中创建和格式化RBAC资源。 RBAC资源有&#xff1a; ServiceAccount(namespaced) Role(namespaced) ClusterRole RoleBinding(namespaced) ClusterRoleBinding YAML配置 RBAC和服务账户配置应该独立的key。它们是独立…

【WinRAR技巧】WinRAR整理密码是什么意思?

之前给大家介绍过WinRAR自动加密的设置方法&#xff0c;今天再介绍一种RAR压缩包加密方法&#xff1a;整理密码。 什么是整理密码&#xff1a; 在加密rar文件的时候&#xff0c;点击下拉框选择密码&#xff0c;不用输入密码 设置方法&#xff1a; 前面的操作步骤和设置自动…

ubuntu22.04@laptop安装配置VNC服务端

ubuntu22.04laptop安装&配置VNC服务端 1. 源由2. 系统安装3. VNC安装3.1 系统更新3.2 lightdm安装3.3 x11vnc安装3.4 x11vnc配置3.5 x11vnc自启动3.6 x11vnc状态查询 4. 演示视频 1. 源由 最近系统搞TensorFlow, OpenCV, Python&#xff0c;折腾各种环境&#xff0c;把系统…

GitLab升级16.8.0失败

漏扫报警Gitlab高危漏洞&#xff0c;于是立即升级。 yum命令提示有16.8.0可以升级&#xff0c;输入y 1G的软件包下载完毕&#xff0c;检测正常&#xff0c;安装软件包... 之后报错退出。 根据错误提示了解到由于上一次gitlab-ctl reconfigure执行失败导致执行升级程序退出。…

提升编程效率的利器: 解析Google Guava库之集合篇Table二维映射(四)

在Java开发中&#xff0c;我们经常使用Map数据结构来存储键值对&#xff0c;其中键是唯一的&#xff0c;可以快速查找到对应的值。但在某些场景下&#xff0c;我们可能需要一个更复杂的映射结构&#xff0c;其中键由两部分组成&#xff0c;类似于一个二维表格的行和列。Guava库…

自动化测试脚本编写(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 自动化测试脚本 什么是自动化测试&#xff1f; 自动化测试是验…

Spring Cloud + Vue前后端分离-第15章 课程总结

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第15章 课程总结 重点难点梳理 环境的搭建 代码生成器 文件上传和视频播放 通用权限设计 学习技巧 养成做笔记的习惯 养成阶段性提交代码的习惯 问答区多交流

springboot 动态导出pdf

springboot 动态导出pdf 原理是通过freemarker插入数据到html模版里面&#xff0c;html你就叫前端帮你写好&#xff0c;他不写你就告诉你主管让他叫他写&#xff0c;你只管往预留的位置插入数据就行&#xff0c;然后通过itextpdf会将准备好html文件转成PDF。 ### 1、准备依赖 &…

思维题之T恤衫

[ABC332C] T-shirts - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 源于atcoder 由于字符串的长度为1000.不论怎样&#xff0c;顺序枚举即可。 import java.awt.FontFormatException; import java.awt.geom.AffineTransform; import java.awt.image.BandCombineOp; import …

自定义注解实现动态数据源

在Java开发中&#xff0c;使用多数据源能够提高系统的灵活性和性能。本文将通过介绍自定义注解的方式&#xff0c;实现动态数据源的切换。通过这种创新性的方法&#xff0c;开发者可以根据业务需求轻松切换数据库连接&#xff0c;实现数据源的动态管理&#xff0c;提升系统的可…

C++类和对象(中)

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

如何在Win系统安装Jupyter Notbook并实现无公网ip远程访问本地笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

Mybatis-Plus基础

typora-copy-images-to: img Mybatis Plus 今日目标&#xff1a; 了解mybatisplus的特点能够掌握mybatisplus快速入门能够掌握mybatisplus常用注解能够掌握mybatisplus常用的增删改查能够掌握mybatisplus自动代码生成 1 MybatisPlus简介 1.1 MybatisPlus概述 ​ MyBatis-…

【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】

文章目录: 1. 下拉菜单 2. 文本域3.label标签 4.按钮- button 4.1 reset重置按钮结合form表单区域使用 5.无语义的布局标签 6.字符实体 注册信息综合案例 表单第二节 1. 下拉菜单 标签: select嵌套option,select是下拉菜单整体&#xff0c;option是下拉菜单的每一项。 代码…

MySQL运维实战(5.1) 字符和编码的基本概念

作者&#xff1a;俊达 字符和编码 字符 字符是符号&#xff0c;是人们用于交流的各类符号&#xff0c;如26个英文字母、汉字、标点符号、数学运算符、其他语言的字母和符号。 编码 编码是计算机中以二进制方式存储字符的方式。每个字符都有一个对应的编码值&#xff0c;计算机…