题目来源

  • leetcode:514. 自由之路

题目描述


class Solution {public:int findRotateSteps(string ring, string key) {}
};

题目解析

先分析数据量

  • 1 <= ring.length, key.length <= 100:因为指令数最多 1 0 8 10^8 108,由于 1 0 8 / 100 = 1 0 8 / 1 0 2 = 1 0 6 = ( 1 0 2 ) 3 10^8/100=10^8/10^2=10^6=(10^2)^3 108/100=108/102=106=(102)3,所以选定的算法的时间复杂度最多 O ( N 3 ) O(N^3) O(N3),比如Floyd算法、DP
  • ring 和 key 只包含小写英文字母:我们可以用数组的桶计算来统计每个字符出现的频率
  • 保证 字符串 key 一定可以由字符串 ring 旋转拼出:不需要做参数有效性检查

分析题意

可以这样理解:

  • 给定一个手摇电话机,上面刻了很多字符,有一个指针,刚开始指向12点的位置
  • 给定一个字符串key,问你最少操作几次能播出电话
  • 操作有两种方式:
    • 拨动指针
    • 按下步数

题目分析

  • 要播出电话,就要按照顺序将key将指针一一指向

    • 每个字符都要能在ring上找到,有一个不能找到就返回INT_MAX
    • 可以遍历key,key[0]为第一个要匹配的字符、key[1]为第二个要匹配的字符…
  • 我们的目标:拼出 key 中的每个字符,求总共的最少步数。
    • 每个 key 字符对齐后都会按下按钮,按的次数固定,关键看旋转对齐 key 字符们的步数。
    • 对于每个 key 字符,它在 ring 中可能有多个,我们每次选择对齐其中一个,每个都试。
    • 对于下一个 key 字符,它在 ring 中可能也有多个,我们用 dfs 去尝试所有的选择:作出一个选择,基于当前选择,再做选择(往下递归)。
    • 怎么对齐呢?每次找字母,有两种旋转方式,带来两种不同的旋转格数:
      • 顺时针旋转
      • 逆时针旋转
class Solution {int dial(int preButton, int next, int size){int p1 = std::abs(preButton - next) ;int p2 = std::min(preButton, next) + size - std::max(preButton, next);return std::min(p1, p2);}// 电话里:指针指着的上一个按键preButton// 目标里:此时要搞定哪个字符?keyIndex// map : key 一种字符 value: 哪些位置拥有这个字符// ring_len: 电话大小int process(int preButton, int keyIndex, std::string &key,  std::map<char, std::vector<int>> & map, int ring_len){if(keyIndex == key.size()){return 0;}// 还有字符需要搞定int ans = INT32_MAX;char cur = key[keyIndex];auto nextPositions = map[cur];  //保证: 字符串 key 一定可以由字符串  ring 旋转拼出for(int next : nextPositions){int cost = dial(preButton, next, ring_len) + 1 + process(next, keyIndex + 1, key, map, ring_len);ans = std::min(ans, cost);}return ans;}public:int findRotateSteps(string ring, string key) {std::map<char, std::vector<int>> map;for (int i = 0; i < ring.size(); ++i) {map[ring[i]].emplace_back(i);}return process(0, 0, key, map, ring.size());}
};

leetcode:514. 自由之路相关推荐

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

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

  2. 【Leetcode 每日一题】514. 自由之路(BFS+优先队列)

    Leetcode 每日一题 题目链接:514. 自由之路 难度: 困难 解题思路: 这道题乍一看,可以选择用动态规划或者BFS来求解.本文使用BFS来进行解答.注意到题中有一个最小的到路径.所以我们可 ...

  3. 【LeetCode】自由之路 [H](记忆化搜索)

    514. 自由之路 - 力扣(LeetCode) 一.题目 电子游戏"辐射4"中,任务 "通向自由" 要求玩家到达名为 "Freedom Trail ...

  4. leetcode 动态规划 514. 自由之路

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

  5. leetcode【每日一题】514. 自由之路 Java【待完成

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

  6. leecode 514. 自由之路

    题目描述 电子游戏"辐射4"中,任务 "通向自由" 要求玩家到达名为 "Freedom Trail Ring" 的金属表盘,并使用表盘拼写特 ...

  7. LeetCode_514_自由之路

    题目:自由之路 难度:困难 514.自由之路 电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring" ...

  8. 卖萌屋算法岗面试手册上线!通往面试自由之路

    一只小狐狸带你解锁 炼丹术&NLP 秘籍 作为算法工程师,基础知识的重要性自然不必多说.虽然在有些项目中比较难感受到基础的作用,但扎实的coding能力,对算法本质和适用情况的理解,始终是决定 ...

  9. 订阅了李笑来的“通往财富自由之路”栏目

    早晨醒来看"学习学习再学习"公众号,发现李笑来在"得到"应用上推出了付费订阅栏目"财富自由之路",199元/年. 思考了几分钟之后,还是决定 ...

最新文章

  1. goland 配置goroot找不到SDK
  2. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
  3. 【Tools】CSDN-markdown编辑器使用说明
  4. Android 6.0 超级简单的权限申请2 (Permission)
  5. typeof 数据类型转换
  6. DrawArc绘制弧线
  7. jstl版本的jar下载?
  8. 惠普计算机硬盘序列号怎么查询,硬盘序列号怎么看 【设置办法】
  9. 今天第一次来这里开博,大家多多指教
  10. 网记者采访时,一直称李某萍为“妻子”
  11. 深度学习笔记(50) 一维到三维推广
  12. 短距离无线通信设备的天线设计
  13. win10动态壁纸怎么设置_动态壁纸怎么设置,试试这款应用
  14. 程序员,被代码耽误的段子手!
  15. 爬取优美图库里的照片,并存到文件夹中
  16. Photoshop制作逼真燃烧的文字效果
  17. u深度做linux启动盘,u深度u盘启动盘制作教程
  18. 《鲸鱼安慰了大海》精选篇章
  19. html 控制横向打印机,hp LaserJet 1000打印机怎么设置实现横向打印?
  20. confluence 删除_知识管理平台Confluence教程:如何删除或还原页面?

热门文章

  1. 国内主流在用的10大后台UI框架,私活必备
  2. npm ERR! A complete log of this run can be found in:
  3. phoenix查询超时
  4. 简约而不简单的CountDownLatch
  5. luogu 1181
  6. C语言中的数字——水仙花数
  7. 【MySQL高级】Mysql锁问题
  8. edusoho阿里云直播php源代码披露
  9. 电脑是怎样上网的 (二) 从网线到网络设备
  10. fiddler会话图标