每日一题 力扣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.hqwc.cn/news/437835.html

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

相关文章

PHP语法

#本来是在学命令执行&#xff0c;所以学了学&#xff0c;后来发现&#xff0c;PHP语法和命令执行的关系好像没有那么大&#xff0c;不如直接学php的一些命令执行函数了。# #但是还是更一下&#xff0c;毕竟还是很多地方都要求掌握php作为脚本语言&#xff0c;所以就学了前面的…

【AI视野·今日Sound 声学论文速览 第四十七期】Fri, 12 Jan 2024

AI视野今日CS.Sound 声学论文速览 Fri, 12 Jan 2024 Totally 10 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Contrastive Loss Based Frame-wise Feature disentanglement for Polyphonic Sound Event Detection Authors Yadong Guan, Jiqing Han,…

八种Flink任务监控告警方式

目录 一、Flink应用分析 1.1 Flink任务生命周期 1.2 Flink应用告警视角分析 二、监控告警方案说明 2.1 监控消息队中间件消费者偏移量 2.2 通过调度系统监控Flink任务运行状态 2.3 引入开源服的SDK工具实现 2.4 调用FlinkRestApi实现任务监控告警 2.5 定时去查询目标库…

Ubuntu 22.04安装Nginx负载均衡

君衍. 一、编译安装Nginx二、轮询算法实现负载均衡三、加权轮询算法实现负载均衡四、ip_hash实现负载均衡 一、编译安装Nginx 这里我们先将环境准备好&#xff0c;我使用的是Ubuntu22.04操作系统&#xff1a; 这个是我刚安装好的&#xff0c;所以首先我们进行保存快照防止安装…

实战教学:用Semantic Kernel框架集成腾讯混元大模型应用

导语 | 众所周知&#xff0c;Semantic Kernel 主要支持国外的两款大模型&#xff0c;但这对于开发者而言&#xff0c;显然是不够的&#xff0c;尤其是当我们希望对接国内的大模型时&#xff0c;我们应该怎么做呢&#xff1f;如何用 Semantic Kernel 通过 oneapi 来集成腾讯混元…

如何对Microsoft 365中Loop文档进行权限划分

Microsoft 365中Loop文档的权限划分为两种&#xff1a;第一种是共享创意页面。第二种是共享特定的Loop组件。 共享创意页面。 进入创意页面后&#xff0c;点击右上角的“共享”-“页面链接”。 如上图所示&#xff0c;页面共享分三种类型。以“你选择的人”为例。添加要共享的…

iOS 文件分割保存加密

demo只是验证想法&#xff0c;没有做很多异常处理 默认文件是大于1KB的&#xff0c;对于小于1KB的没有做异常处理demo中文件只能分割成2个&#xff0c;可以做成可配置的N个文件分割拼接还可以使用固定的二进制数据&#xff0c;拼接文件开头或结尾 不论哪种拼法&#xff0c;目的…

防御保护--NAT策略

目录 NAT策略 NAT类型 server-map表 P2P --- peer to peer 网络类型 ​编辑 目标NAT--服务器映射 双向NAT ​编辑 多出口NAT NAT策略 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多NAPT 服务器映射 源NAT--基于源IP地址进行转…

GIS应用水平考试一级—2009 年度第二次

全国信息化工程师——GIS应用水平考试 2009 年度第二次全国统一考试一级 试卷说明: 1、本试卷共9页,6个大题,满分150 分,150 分钟完卷。 2、考试方式为闭卷考试。 3、将第一、二、三題的答案用铅笔涂写到(NCIE-GIS)答题卡上。 4、将第四、五、六题的答案填写到主观题答题卡上…

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史&#xff08;&#x1f609;&#x1f310;&#x1f47d;踏上神奇的网页编程之旅&#xff09;1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…

千川投流怎么涨粉的?巨量千川粉丝是怎么投流的呢?

在当今数字时代&#xff0c;流量已经成为了一个品牌或产品成功与否的关键因素。因此&#xff0c;千川投流作为一种有效的涨粉引流推广方法&#xff0c;已经成为了许多品牌和产品的首选。本文将向您详细介绍千川投流涨粉引流推广方法&#xff0c;帮助您实现粉丝数量的暴涨目标。…

数据可视化工具JSON Crack结合内网穿透实现公网访问

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…