2021-08-08:自由之路。电子游戏“辐射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 的下一个字符(下一阶段), 直至完成所有拼写。

福大大 答案2021-08-08:

递归。具体见代码。

代码用golang编写。代码如下:

package mainimport ("fmt""math"
)func main() {ring := "godding"key := "gd"ret := findRotateSteps(ring, key)fmt.Println(ret)
}func findRotateSteps(r string, k string) int {N := len(r)map0 := make(map[byte][]int)for i := 0; i < N; i++ {if _, ok := map0[r[i]]; !ok {map0[r[i]] = make([]int, 0)}map0[r[i]] = append(map0[r[i]], i)}M := len(k)dp := make([][]int, N)for i := 0; i < N; i++ {dp[i] = make([]int, M+1)}for i := 0; i < N; i++ {for j := 0; j <= M; j++ {dp[i][j] = -1}}return process(0, 0, k, map0, N, dp)
}// 电话里:指针指着的上一个按键preButton
// 目标里:此时要搞定哪个字符?keyIndex
// map : key 一种字符 value: 哪些位置拥有这个字符
// N: 电话大小
// f(0, 0, aim, map, N)
func process(preButton int, index int, str string, map0 map[byte][]int, N int, dp [][]int) int {if dp[preButton][index] != -1 {return dp[preButton][index]}ans := math.MaxInt64if index == len(str) {ans = 0} else {// 还有字符需要搞定呢!cur := str[index]nextPositions := map0[cur]for _, next := range nextPositions {cost := dial(preButton, next, N) + 1 + process(next, index+1, str, map0, N, dp)ans = getMin(ans, cost)}}dp[preButton][index] = ansreturn ans
}func dial(i1 int, i2 int, size int) int {return getMin(Abs(i1-i2), getMin(i1, i2)+size-getMax(i1, i2))
}func getMin(a int, b int) int {if a < b {return a} else {return b}
}func Abs(a int) int {if a < 0 {return -a} else {return a}
}func getMax(a int, b int) int {if a > b {return a} else {return b}
}

执行结果如下:


左神java代码

2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表相关推荐

  1. 给定一个字符串str,给定一个字符串类型的数组arr,/出现的字符都是小写英文arr每一个字符串,/代表一张贴纸,你可以把单个字符剪开使用

    package 左神题目.dp; import java.util.*; //给定一个字符串str,给定一个字符串类型的数组arr, // 出现的字符都是小写英文arr每一个字符串, // 代表一张贴 ...

  2. 给定一个字符串,输出第一次出现k次的字母java,c++实现

    题目: 给定一个字符串,输出第一次出现k次的字母. 示例:    输入:abbcdaabgb               3    输出:a 输入:aaabbb               3     ...

  3. 给定一个字符串s,返回去掉子串mi后的字符串。

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个字符串s,返回去掉子串"mi"后的字符串.(注:删除n个mi后,仍包含mi应一同删除,如ammim ...

  4. Python练习题:---给定一个字符串 {xxx[xxx{xxx}]xx{x[xxx]xxx{xxx}xx}x} 判断其中的 {}[]() 是否成对出现

    给定一个字符串 {xxx[xxx{xxx}]xx{x[xxx]xxx{xxx}xx}x} 判断其中的 {} 是否成对出现 答题思路: 使用堆栈进行解决 我们首先压栈一个左括号,当什么时候检测到与之对应 ...

  5. python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...

  6. Java给定一个字符串数组,判断每个字符出现次数

    题目要求:给定一个字符串,判断每个字符出现多少次? 解决思路:利用Map的特性:即Map集合中如果两个key(键)值是一样相同的,那么,后放(put)入的值会将前面存在的value(值)替换掉,也就是 ...

  7. java 求最长重复子串_给定一个字符串,求出其最长的重复子串。

    #include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...

  8. 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)...

    需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如:  a 不替换  b 不替换  ab 不替换  ba 不替换  aba 不替换  aab ...

  9. Java中找出s字符串的回文_给定一个字符串 s,找到 s 中最长的回文子串。

    题目描述:给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路: 判断s[i..j]是否是回文字符串,依赖于s[i+1...j-1],这种一个问题的结果依赖于 ...

最新文章

  1. python windows系统_python管理windows系统tomcat服务
  2. vba基本操作 -- 单元格操作
  3. Java黑皮书课后题第2章:2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加
  4. 爆牙齿的世界杯日记(小组末轮AB组)
  5. 超形象!著名的三角不等式演示动图!
  6. zbrush常用笔刷_ZBrush中常用笔刷综合简介
  7. python猜数字1001untitled_ML - Python 基础
  8. Win11系统无法安装GPT分区的解决方法
  9. es6 初级之箭头函数
  10. java future模式 所线程实现异步调用
  11. oracle pmon andsmon,SMON and PMON
  12. 2020-12-19 nn.CrossEntropyLoss()
  13. html中加粗文字,span文字加粗_span盒子对象内字体加粗
  14. 2020 05 02 记录思考
  15. S/MIME电子邮件签名证书
  16. Mysql更新百万历史数据
  17. 第10章 Spark(全面解读Spark架构体系)
  18. [原][连载]那时花开(三)
  19. vue2+vuecli3+elementUI后台管理系列之sidebar导航的开发(五)
  20. Syntiant TinyML 开发板 + Edge Impulse 机器学习实现语音识别

热门文章

  1. 测试用例--------水杯
  2. DataTable的AcceptChanges()方法和DataRow的RowState属性
  3. 从O2O和社交电商的协同效应来重新审视传统实体小店
  4. Boosting方法及代码实战
  5. IOCP 简单的完成端口读写文件
  6. 【回溯】B035_LQ_k调数列的个数(全排列+剪枝)
  7. 微信开发教程:用户账号绑定到微信公众号的方法分享
  8. c语言贪心算法背包问题,[算法]背包问题的经典算法和贪心算法解答,C语言实现...
  9. 腾讯大咖说:战术竞技类手游性能如何管理?
  10. Win7打开文件安全警告取消方法