514. 自由之路 - 力扣(LeetCode)

一、题目

电子游戏“辐射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 旋转拼出

二、代码

class Solution {public int findRotateSteps(String ring, String key) {// String转化为字符串数组char[] ringC = ring.toCharArray();char[] keyC = key.toCharArray();// 构造表盘上每一个字符都有哪些位置,存储在Map中HashMap<Character, ArrayList<Integer>> ringMap = new HashMap<>();for (int i = 0; i < ringC.length; i++) {if (ringMap.containsKey(ringC[i])) {ringMap.get(ringC[i]).add(i);} else {ArrayList<Integer> arr = new ArrayList<>();arr.add(i);ringMap.put(ringC[i], arr);}}// 创建缓存数组int[][] dp = new int[keyC.length][ringC.length];return process(0, keyC, ringMap, 0, ringC.length, dp);}// 当前检查要拨打的index位置的字符的最小步数,此时电话机上的指针指向圆盘的ringIndex位置public int process(int index, char[] keyC, HashMap<Character, ArrayList<Integer>> ringMap, int ringIndex, int ringLen, int[][] dp) {// 当遍历完所有的要拨打的字符,当前来到越界位置,返回0步数if (index == keyC.length) {return 0;}// 如果缓存中已经有结果了,直接返回if (dp[index][ringIndex] != 0) {return dp[index][ringIndex];}// 找到当前要拨打的keyC[index]字符在电话机的圆盘上的全部位置,递归尝试每一个位置,去找到步数最小的转轮方法int min = Integer.MAX_VALUE;// 获取圆盘上所有keyC[index]字符的位置ArrayList<Integer> nextPositions = ringMap.get(keyC[index]);// 尝试每一个转盘上的位置for (Integer i : nextPositions) {// 尝试顺时针转到i位置和逆时针转到i位置(minPay(ringIndex, i, ringLen)),找到最小消耗,并且再加上后续的最小步数(process(index + 1, keyC, ringMap, i, ringLen, dp)),就是我们要求的当前层的结果min = Math.min(min, minPay(ringIndex, i, ringLen) + process(index + 1, keyC, ringMap, i, ringLen, dp));}// 存入缓存  这里要+1,因为每转到一个字符,还需要点一下按钮,这也算是一次步数dp[index][ringIndex] = min + 1;return dp[index][ringIndex];}// 将指针从fromIndex位置转到toIndex位置的最小步数// 这里会尝试顺时针转到toIndex和逆时针转到toIndex,看哪种转法步数最少public int minPay(int fromIndex, int toIndex, int ringLen) {// Math.abs(toIndex - fromIndex)   顺时针// Math.abs(ringLen - Math.max(toIndex, fromIndex) + Math.min(fromIndex, toIndex)) 逆时针   这个就是个简单的数学关系,很好理解,就是注意把fromIndex < toIndex和fromIndex >= toIndex两种情况都考虑进去即可return Math.min(Math.abs(toIndex - fromIndex), Math.abs(ringLen - Math.max(toIndex, fromIndex) + Math.min(fromIndex, toIndex)));}// 这道题没有必要改动态规划,因为这道题的枚举过程无法进行斜率优化,枚举过程中的相对位置关系不是固定的,依赖的位置数量也是不固定的。
}

三、解题思路

去尝试每一个位置的最小步数的转法,然后从所有结果中找到最小值即可。

【LeetCode】自由之路 [H](记忆化搜索)相关推荐

  1. LeetCode 514. 自由之路(记忆化递归 / DP)

    文章目录 1. 题目 2. 解题 1. 题目 电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring" ...

  2. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  3. 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...

  4. dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割

    记忆化递归的必要性: 普通的递归可能会重复求解某一值,类似斐波那契数列.同样的子问题可能会被求解多次,这样就会很慢很慢很慢 解决方法:我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接 ...

  5. 【LeetCode】我能赢吗 [M](记忆化搜索)

    464. 我能赢吗 - 力扣(LeetCode) 一.题目 在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或 ...

  6. [Leetcode][第322题][JAVA][零钱兑换][回溯][记忆化搜索][动态规划]

    [问题描述][中等] [解答思路] 1. 递归(超时) class Solution {int res = Integer.MAX_VALUE;public int coinChange(int[] ...

  7. [Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]

    [问题描述][困难] [解答思路] 1. 记忆化搜索 时间复杂度:O(n^3) 空间复杂度:O(n^2) class Solution {public int[][] rec;public int[] ...

  8. [H博弈论] lc1728. 猫和老鼠 II(博弈论+记忆化搜索+周赛224_4)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:1728. 猫和老鼠 II 2. 题目解析 棋盘类博弈论问题大多数采用记忆化搜索来进行优化.有效的状态空间没那么多,大多数都 break ...

  9. BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】

    题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  10. hdu1978 简单记忆化搜索

    题意: How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

最新文章

  1. 移柯L620模组使用MQTT协议连接移动OneNet云平台(NB-IoT专栏—进阶篇3)
  2. D1net阅闻:思科占全球交换路由器53%市场份额
  3. linux内核kfifo(一)
  4. 链表——PowerShell版
  5. 站在汽修厂的角度看需求
  6. Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhost-config
  7. 进击的二维码 | ArcBlock 课堂预告
  8. Log4j的应用实例
  9. HTML+CSS+JS实现 ❤️创意几何love字母特效❤️
  10. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...
  11. 4位数的水仙花c语言,C语言程序设计100例之(4):水仙花数
  12. PowerDesigner逆向工程导入MYSQL数据库总结
  13. IO 模型 IO 多路复用
  14. linux 跑java程序_Linux下独立执行Java程序
  15. Java开发过程中需要注意的技巧有哪些?
  16. git-ftp:用git管理ftp服务器简单入门
  17. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-2.微服务下登录检验解决方案 JWT讲解...
  18. 架构蓝图--软件架构 “4+1“ 视图模型
  19. 《FLUENT 14流场分析自学手册》——1.5 湍流模型
  20. 瑞星企业防毒2010网络版(二)管理及应用

热门文章

  1. 云教室和传统机房的区别在哪里?看完你就明白了
  2. 服务器加固:记录服务器被暴力破解密码,被当做肉鸡攻击别人
  3. mpstat,pidstat,iostat,iotop,lsof
  4. zed相机拆机_ZED 迷你相机:将 VR 转变成 AR 的黑科技
  5. qt.qpa.plugin: Could not load the Qt platform plugin “xcb“
  6. Lua学习——Coroutine协程
  7. 在 BUF 和 BUF+1、BUF+2 单元分别放有一个无符号字节型数,编程序将其 中最大数存入 MAX 单元,并在屏幕上显示。
  8. 中国石油大学(北京)-《化学与社会》第二阶段在线作业
  9. 判断点P是否在三角形ABC内部
  10. win10文件浏览器多标签功能