问题描述

In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a metal dial called the "Freedom Trail Ring", and use the dial to spell a specific keyword in order to open the door.

Given a string ring, which represents the code engraved on the outer ring and another string key, which represents the keyword needs to be spelled. You need to find the minimum number of steps in order to spell all the characters in the keyword.

Initially, the first character of the ring is aligned at 12:00 direction. You need to spell all the characters in the string key one by one by rotating the ring clockwise or anticlockwise to make each character of the string key aligned at 12:00 direction and then by pressing the center button.

At the stage of rotating the ring to spell the key character key[i]:

  1. You can rotate the ring clockwise or anticlockwise one place, which counts as 1 step. The final purpose of the rotation is to align one of the string ring's characters at the 12:00 direction, where this character must equal to the character key[i].

  2. If the character key[i] has been aligned at the 12:00 direction, you need to press the center button to spell, which also counts as 1 step. After the pressing, you could begin to spell the next character in the key (next stage), otherwise, you've finished all the spelling.

Example:


Input: ring = "godding", key = "gd"
Output: 4
Explanation:
For the first key character 'g', since it is already in place, we just need 1 step to spell this character.
For the second key character 'd', we need to rotate the ring "godding" anticlockwise by two steps to make it become "ddinggo".
Also, we need 1 more step for spelling.
So the final output is 4.

Note:

  1. Length of both ring and key will be in range 1 to 100.
  2. There are only lowercase letters in both strings and might be some duplcate characters in both strings.
  3. It's guaranteed that string key could always be spelled by rotating the string ring.

算法分析:

该题需要使用动态规划算法进行计算
先声明一个二维的动态规划表 int [][] dp=new int[key.length()][ring.length()]; dp[i][j] 的值表示转动到 key 中的第 i 个字符在 ring 中第 j 个位置时总共需要的转动 step (不包括按下 button 键的 step )。
状态转移方程:
dp[i][j]=min(dp[i][j],dp[i-1][k]+min(abs(j-k),ring.leng()-abs(j-k))).
该方程中,i 表示当前考察的 key 中的字符在 key 中的下标,j 表示当前考察的字符在 ring 中的下标,k 表示上一个考察的字符在 ring 中的下标。

Java 算法实现:

public class Solution {
public int findRotateSteps(String ring, String key) {
ArrayList<Integer>[] list=new ArrayList[128];
char ch;
for(int i=0;i<ring.length();i++){//统计ring中所有的字符在ring中的下标
ch=ring.charAt(i);
if(list[ch]==null){
list[ch]=new ArrayList<Integer>();
}
list[ch].add(i);
} int ringLoop=ring.length();
int[][]dp=new int[key.length()][ring.length()];
for(Integer index:list[key.charAt(0)]){//对 key 中第一个字符在 ring 中的位置进行记录
dp[0][index]=Math.min(index, ringLoop-index);
}
char former=key.charAt(0),cur;
for(int i=1;i<key.length();i++){//动态规划算法
cur=key.charAt(i);
for(Integer indexCur:list[cur]){//遍历当前考察的字符在 ring 中的位置
dp[i][indexCur]=Integer.MAX_VALUE;
for(Integer indexFormer:list[former]){//遍历上一个字符在 ring 中的位置
int distance=Math.abs(indexCur-indexFormer);//当前考察的字符与上一个考察的字符在 ring 中的距离
dp[i][indexCur]=Math.min(dp[i][indexCur], dp[i-1][indexFormer]+Math.min(distance,ringLoop-distance));
}
}
former=cur;
}
int mindist=Integer.MAX_VALUE;
int depth=key.length()-1;// key 中最后一个字符的下标
for(Integer lastIndex:list[key.charAt(depth)]){//遍历 key 中最后一个字符在 ring 中的所有位置
if(mindist>dp[depth][lastIndex]){ //找到到达 key 中最后一个字符所需的最小 step 数
mindist=dp[depth][lastIndex];
}
}
return mindist+key.length(); //总的 step 数要包括按下 button 键的次数
}
}

LeetCode 514----Freedom Trail的更多相关文章

  1. 514. Freedom Trail

    In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a metal ...

  2. 514 Freedom Trail 自由之路

    详见:https://leetcode.com/problems/freedom-trail/description/ C++: class Solution { public: int findRo ...

  3. [LeetCode] Freedom Trail 自由之路

    In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a metal ...

  4. [Swift]LeetCode514. 自由之路 | Freedom Trail

    In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a metal ...

  5. Java实现 LeetCode 514 自由之路

    514. 自由之路 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写 ...

  6. Leetcode 514.自由之路

    自由之路 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写特定关键词 ...

  7. 动态规划——Freedom Trail

    题目:https://leetcode.com/problems/freedom-trail/ 额...不解释大意了,题目我也不想写过程了有点繁琐,直接给出代码: public int findRot ...

  8. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  9. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

  10. Leetcode problems classified by company 题目按公司分类(Last updated: October 2, 2017)

    All LeetCode Questions List 题目汇总 Sorted by frequency of problems that appear in real interviews. Las ...

随机推荐

  1. 汉诺塔的python 动画演示

    1.简介 古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个 ...

  2. python的copy模块

    python的copy模块 概念 Python中的赋值语句不复制对象,它们在目标和对象之间建立索引,这就是浅复制.对于一些对象或者集合,我们有时需要一个副本,以便可以更改一个副本中的值而不改变其原对象 ...

  3. 进阶篇:4.3)DFA设计指南:宽松公差及人性装配及其他

    本章目的:设计需要为装配考虑,给他们提供各种优待,装配才能做出好产品. 1.前言 机械贴合现实而软件远离现实. 越是学习机械设计的原则,越是感觉他们和一些做人做事的道理相同的. 如,机械设计原则都是有 ...

  4. 【性能测试】:关于Sockets协议的脚本的开发

    一,关于Sockets协议的脚本,首先对报文的解析是一个关键, 报文的解析一般对着接口文档,弄清楚每个字段代表什么意思,如下一段报文,放在data.ws中 "\x00\x00\x01\x5C ...

  5. Mac安装的PyCharm找不到顶部菜单栏 PyCharm找不到setting PyCharm不能个性化设置和直接导库

    安装的是最新版的PyCharm,打开发现没有顶部菜单栏,不能直接导库..有点方 以前的就是下面这种 找了很久发现原来在右下角!!!眼拙 点击画圈圈的地方就可以直接进去导库这些啦〜

  6. 【数组】Triangle

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  7. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment avariable and mvn script match.

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  8. redis实战笔记(1)-第1章 初识Redis

    第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片.    本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...

  9. TCP/IP的基本概念知识

    1.分层     TCP/IP通常是被分成四层协议系统的,应用层(Telnet.FTP和Email等).运输层(TCP.UDP).网络层(IP.ICMP.IGMP等)和链路层(设备驱动程序),每一层各 ...

  10. linux编程之GDB调试

    GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显 ...