Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自由之路

自由之路

作者头像
你的益达
发布于 2020-11-12 02:16:56
发布于 2020-11-12 02:16:56
78900
代码可运行
举报
运行总次数:0
代码可运行

视频游戏“辐射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 的下一个字符(下一阶段), 直至完成所有拼写。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/freedom-trail 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: ring = "godding", key = "gd"
输出: 4
解释:
 对于 key 的第一个字符 'g',已经在正确的位置, 我们只需要1步来拼写这个字符。 
 对于 key 的第二个字符 'd',我们需要逆时针旋转 ring "godding" 2步使它变成 "ddinggo"。
 当然, 我们还需要1步进行拼写。
 因此最终的输出是 4。
提示:

ring 和 key 的字符串长度取值范围均为 1100;
两个字符串中都只有小写字符,并且均可能存在重复字符;
字符串 key 一定可以由字符串 ring 旋转拼出。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/freedom-trail
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决方案

对于该问题的第一思路为按题意模拟,对于key的每个字符有两种选择顺/逆时针旋转,递归枚举出所有可能性,总体时间复杂度为O(N * 2 ^ N )。N范围在100,明显该方案过不了。

定义dp[i] [j] 为逐个拼完key[0:i]元素,最终ring[j]指向12:00方向的最少步数。

首先只有key[i] == ring[j]时才有意义,否则拼不出来

然后我们需要寻找dp[i] [j]的上一个状态(即其可以由那些状态转移而来),发现其可以由dp[i - 1] [k](此时只需key[i] == ring[k]即可)。

上式中abs(j - k)描述的是由dp[i - 1] [k]转移到dp[i] [j] 使用的是逆时针旋转, N - abs(j - k)则描述的是由dp[i - 1] [k]转移到dp[i] [j] 使用的是顺时针旋转。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func findRotateSteps(ring string, key string) int {
    N := len(ring)
    M := len(key)
    dp := make([][]int, 0, M)
    reme := make([][]int,26, 26)
    ans := 0x3f3f3f
    for i := 0; i < M; i++{
        dp = append(dp, make([]int, N, N))
    }
    for i := 0; i < M; i++{
        for j := 0; j < N; j++{
            dp[i][j] = 0x3f3f3f
        } 
    }
    for idx, val := range ring{
        reme[val - 'a'] = append(reme[val - 'a'], idx)
        if ring[idx] == key[0] {
            dp[0][idx] = min(idx, N - idx) + 1
        }
    }
    for i := 1; i < M; i++{
        for j := 0; j < N; j++{
            if key[i] != ring[j]{
                continue
            }
            for _, k := range reme[key[i - 1] - 'a']{
                dp[i][j] = min(dp[i][j], dp[i - 1][k] + min(abs(j - k), N - abs(j - k)) + 1)
            }
            if i == M - 1{
                ans = min(ans, dp[i][j])
            }
        } 
    }
    return ans

}

func min(num1, num2 int) int{
    if num1 < num2{
        return num1
    }else{
        return num2
    }
}
func abs(num1 int) int{
    if num1 < 0{
        return -1 * num1
    }else{
        return num1
    }
}

时间复杂度为O(N ^ 3)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【一天一大 lee】自由之路 (难度:困难) - Day20201111
视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。
前端小书童
2020/11/19
3500
【一天一大 lee】自由之路 (难度:困难) - Day20201111
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 ring 拼出 key 字符 keyi 的阶段中:您可以将 ring 顺时针或逆时针旋转一个位置,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 keyi 。如果字符 keyi 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。
福大大架构师每日一题
2021/08/08
3570
2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自
LeetCode 514. 自由之路(记忆化递归 / DP)
电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。
Michael阿明
2021/02/19
3340
LeetCode 514. 自由之路(记忆化递归 / DP)
​LeetCode刷题实战514:自由之路
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/03/03
2210
​LeetCode刷题实战514:自由之路
练琴时悟出的动态规划算法,帮我通关了《辐射4》
这个可以转动的圆盘类似是一个密码机关,中间偏上的位置有个红色的指针看到没,你只要转动圆盘可以让指针指向不同的字母,然后再按下中间的按钮就可以输入指针指向的字母。
labuladong
2021/09/23
5850
LeetCode 1974. 使用特殊打字机键入单词的最少时间
https://leetcode-cn.com/problems/minimum-time-to-type-word-using-special-typewriter/
freesan44
2021/10/27
5210
LeetCode 1974. 使用特殊打字机键入单词的最少时间
LeetCode 1974. 使用特殊打字机键入单词的最少时间
有一个特殊打字机,它由一个 圆盘 和一个 指针 组成, 圆盘上标有小写英文字母 ‘a’ 到 ‘z’。 只有 当指针指向某个字母时,它才能被键入。指针 初始时 指向字符 ‘a’ 。
Michael阿明
2021/09/06
3620
刷穿力扣(31~60)
浪漫主义狗
2023/10/31
3960
刷穿力扣(31~60)
二维数组的花式遍历技巧盘点
有不少读者说,看过很多公众号历史文章之后掌握了框架思维,可以解决大部分有套路框架可循的题目。
labuladong
2021/12/13
1.1K0
二维数组的花式遍历技巧盘点
Two Sigma:面试真题 - 编程(下)
量化投资与机器学习微信公众号,是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业30W+关注者,荣获2021年度AMMA优秀品牌力、优秀洞察力大奖,连续2年被腾讯云+社区评选为“年度最佳作者”。 上一起,QIML为大家分享几道有关Two Sigma面试的计算真题。今天,我们主要为大家分享几道编程真题。 Two Sigma:面试真题(上) 量化对冲基金技术面试中一般都会有pair coding的部分,主要是测试候选
量化投资与机器学习微信公众号
2022/09/22
9970
Two Sigma:面试真题 - 编程(下)
LeetCode 第 227 场周赛题解
如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false。
宫水三叶的刷题日记
2021/02/20
6460
刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/
种花家的奋斗兔
2024/05/25
751
刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现
Leetcode | 第C节:字符串综合题(2)
东京奥运会圆满收官!当然我自己也将迎来留学前的最后准备,所以更新速度可能还是会比较慢……但还好,大部分的内容都已经在之前写的差不多了,也希望最后这几篇我也能够尽快更完,当然也希望大家可以谅解~
学弱猹
2021/09/07
7190
《算法竞赛进阶指南》0x14 Hash
与离散化思想类似,当我们要对若干复杂信息进行统计时,可以用 Hash函数 把这些复杂信息映射到一个容易维护的值域内
一只野生彩色铅笔
2022/10/31
1.8K0
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-128 Cowboys
        这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍,让大家方便去搜索,所有题目都会有几种语言的写法,帮助大家提供一个思路,当然,思路只是思路,千万别只看着答案就认为会了啊,这个方法基本上很难让你成长,成长是在思考的过程中找寻到自己的那个解题思路,并且首先肯定要依靠于题海战术来让自己的解题思维进行一定量的训练,如果没有这个量变到质变的过程你会发现对于相对需要思考的题目你解决的速度就会非常慢,这个思维过程甚至没有纸笔的绘制你根本无法在大脑中勾勒出来,所以我们前期学习的时候是学习别人的思路通过自己的方式转换思维变成自己的模式,说着听绕口,但是就是靠量来堆叠思维方式,刷题方案自主定义的话肯定就是从非常简单的开始,稍微对数据结构有一定的理解,暴力、二分法等等,一步步的成长,数据结构很多,一般也就几种啊,线性表、树、图、再就是其它了。顺序表与链表也就是线性表,当然栈,队列还有串都是属于线性表的,这个我就不在这里一一细分了,相对来说都要慢慢来一个个搞定的。蓝桥杯中对于大专来说相对是比较友好的,例如三分枚举、离散化,图,复杂数据结构还有统计都是不考的,我们找简单题刷个一两百,然后再进行中等题目的训练,当我们掌握深度搜索与广度搜索后再往动态规划上靠一靠,慢慢的就会掌握各种规律,有了规律就能大胆的长一些难度比较高的题目了,再次说明,刷题一定要循序渐进,千万别想着直接就能解决难题,那只是对自己进行劝退处理。加油,平常心,一步步前进。
红目香薰
2023/02/16
2070
Noip 2016 Day1 题解
老师让我们刷历年真题, 然后漫不经心的说了一句:“你们就先做做noip2016 day1 吧” 。。。。。。 我还能说什么,,,,,老师你这是明摆着伤害我们啊2333333333 预计分数:100+2
attack
2018/04/13
1.6K0
Noip 2016 Day1 题解
第十一届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
  小蓝特别喜欢 2 ,今年是公元 2020 年,他特别高兴。   他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中包含数字 2 ?
红目香薰
2022/11/29
7950
第十一届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
刷穿力扣(1~30)
浪漫主义狗
2023/10/08
3730
字符串问题-LeetCode 392、383、386、384、396、937(字符串)
你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。
算法工程师之路
2019/12/27
5200
【Day19】LeetCode算法刷题(附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】
解题思路: 为了确定start字符串是否可以通过交换相邻字符获得end字符串,我们可以同时遍历两个字符串,当遇到可以确定两者不能通过交换字符而相等的情况时,返回false即可,完全遍历完说明符合条件,返回true;
.29.
2022/11/15
4940
【Day19】LeetCode算法刷题(附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】
推荐阅读
相关推荐
【一天一大 lee】自由之路 (难度:困难) - Day20201111
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验