【Leetcode 514】自由之路 —— 动态规划

514. 自由之路

电子游戏“辐射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

题目分析

经典动态规划问题,更多案例可见 Leetcode 动态规划详解

我们可以使用动态规划解决本题,解题思路:

  1. 状态定义:
    • dp[i][j] 表示 key 的第 i 个字符, ring 的第 j 个字符与 12:00 方向对齐的最少步数
    • pos[i] 表示字符 i 在 ring 中出现的位置集合,用来加速计算转移的过程
  2. 状态转移方程:枚举上一次与12:00方向对齐的位置k,此次需要从位置k旋转到位置j

d p [ i ] [ j ] = min ⁡ k ∈ p o s [ k e y [ i − 1 ] ] d p [ i − 1 ] [ k ] + m i n a b s ( j − k ) , n − a b s ( j − k ) + 1 dp[i][j]= \displaystyle\min_k∈pos[key[i−1]] {dp[i−1][k] + min{abs(j − k), n − abs(j − k)} + 1} dp[i][j]=kminpos[key[i1]]dp[i1][k]+minabs(jk),nabs(jk)+1

​> min{abs(j − k), n − abs(j − k)} + 1从位置k旋转到位置j的最少步数

  1. 初始状态dp[0][i] = min{i, n - i} + 1,最终答案为 min ⁡ i = 0 n − 1 d p [ m − 1 ] [ i ] \displaystyle\min_i=0^n-1 {dp[m-1][i]} imin=0n1dp[m1][i]

动态规划一般用于求解具有重叠子问题和最优子结构的问题,例如最长公共子序列、背包问题、最短路径等。重叠子问题指的是在求解问题的过程中,多次用到相同的子问题,最优子结构指的是问题的最优解可以通过子问题的最优解来构造

class Solution {public int findRotateSteps(String ring, String key) {int n = ring.length(), m = key.length();// 字符 i 在 ring 中出现的位置集合,用来加速计算转移的过程List<Integer>[] pos = new List[26];for (int i = 0; i < 26; i++) {pos[i] = new ArrayList<Integer>();}for (int i = 0; i < n; i++) {pos[ring.charAt(i) - 'a'].add(i);}int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {Arrays.fill(dp[i], Integer.MAX_VALUE);}for (int i : pos[key.charAt(0) - 'a']) {dp[0][i] = Math.min(i, n - i) + 1;}for (int i = 1; i < m; i++) {for (int j : pos[key.charAt(i) - 'a']) {for (int k : pos[key.charAt(i - 1) - 'a']) {dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + Math.min(Math.abs(j - k), n - Math.abs(j - k)) + 1);}}}return Arrays.stream(dp[m - 1]).min().getAsInt();}
}

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

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

相关文章

鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级

在2023年云栖大会上&#xff0c;阿里云数据库产品事业部负责人李飞飞在主题演讲中提到&#xff0c;瑶池数据库推出“DB存储”一体化能力&#xff0c;结合人工智能、机器学习、存储等方法和创新能力&#xff0c;实现Buffer Pool Extension能力和智能冷温热数据分层能力。在大会的…

写静态页面——粘性定位练习

0、效果&#xff1a; 1、HTML代码&#xff1a;为了简洁采用内部样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

怎么恢复回收站清空的文件?这3个方法收藏好!

“着急&#xff01;想问问大家平常如果不小心清空了回收站&#xff0c;有什么比较好的方法可以恢复回收站里的重要文件吗&#xff1f;” 在日常生活中&#xff0c;我们可能会将一些重要的文件或数据误删进回收站&#xff0c;甚至清空了回收站。这些文件可能包含重要的工作文档、…

交通模拟软件为市政交通发展再加速

城市规划人员利用 DYNAMEQ 开发埃德蒙顿道路模型路线图&#xff0c;推动更智能的未来规划 满足快速发展城市的出行需求 埃德蒙顿市是加拿大阿尔伯塔省的首府。在过去的 10 年中&#xff0c;埃德蒙顿市人口增长了 25&#xff05;&#xff0c;是加拿大发展最快的城市。城市规划人…

【Oracle云】使用 boto3 访问 OCI 对象存储 (AWS S3协议兼容)

在现代云计算环境中&#xff0c;S3&#xff08;Simple Storage Service&#xff09;协议已经成为云对象存储的事实标准。它提供了简单、可扩展、高度耐用的存储解决方案&#xff0c;得到了广泛应用。Oracle Cloud Infrastructure&#xff08;OCI&#xff09;秉承着开放性和灵活…

【PyQt】02-基本UI

文章目录 前言一、首先了解什么是GUI&#xff1f;二、初学程序1.界面展示代码运行结果 2.控件2.1按钮展示代码运行结果 2.2 纯文本和输入框代码运行结果 3、重新设置大小 -resize4、移动窗口-move()5、设置界面在电脑中央5.1 代码运行结果 6、设置窗口图标代码运行结果 7、布局…

电脑用的视频编辑软件有哪些 视频剪辑软件排行榜 视频剪辑软件推荐 视频剪辑培训学习 视频剪辑制作自学 电脑视频剪辑需要什么配置

电脑视频剪辑软件这么多&#xff0c;到底哪些比较好用&#xff1f;下面就让我们以十大电脑视频剪辑软件排行榜来细数好用的软件。另外&#xff0c;电脑视频剪辑需要什么配置&#xff1f;本文也会给大家从内存、CPU等参数上介绍&#xff0c;并推荐好用的电脑设备。 一、十大电脑…

springboot140体育馆使用预约平台的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Go map 读写性能优化 - 分片 map

基本在所有的编程语言中&#xff0c;都有 map 这种数据结构&#xff0c;Go 语言也不例外。 我们知道 Go 是一门对并发支持得比较好的语言&#xff0c;但是 map 并不支持并发读写。 比如&#xff0c;下面这种写法是错误的&#xff1a; var m make(map[int]int) var wg sync.Wa…

人工智能时代:AI提示工程的奥秘 —— 驾驭大语言模型的秘密武器

文章目录 一、引言二、提示工程与大语言模型三、大语言模型的应用实践四、策略与技巧五、结语《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录获取方式 一、引言 随着人工智能技术的飞速发展&#xff0c;大语言模型作为一种新…

海外多语言盲盒App开发:机遇与挑战并存

随着全球化进程的加速&#xff0c;跨文化交流成为人们日常生活和工作中的重要部分。在此背景下&#xff0c;多语言盲盒App的开发成为了一个具有巨大潜力的市场。本文将探讨海外多语言盲盒App开发的机遇与挑战&#xff0c;以及如何应对这些挑战。 一、海外多语言盲盒App开发的机…

【SpringBoot系列】自动装配的魅力:Spring Boot vs 传统Spring

IT行业有哪些证书含金量高? 文章目录 IT行业有哪些证书含金量高?强烈推荐前言区别项目配置&#xff1a;依赖管理&#xff1a;内嵌服务器&#xff1a;开发体验&#xff1a; 实例Spring项目示例&#xff1a;Spring Boot项目示例&#xff1a; 总结强烈推荐专栏集锦写在最后 强烈…