题目来源

  • 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. A.CPP (blur.CPP)如何调用B.CPP (zeros.cpp)中定义的方法
  2. pynlpir.LicenseError: Your license appears to have expired. Try running pynlpir update.
  3. 由于检索用户的本地应用程序数据路径时出错,导致无法生成 SQL Server 的用户实例...
  4. 警告:‘xxxx’ 将随后被初始化
  5. 红黑树(RB-Tree)比AVL强在哪?
  6. 基于线性回归的波士顿房价预测
  7. body onload 控制窗口大小 html,HTML5 对各个标签的定义与规定:body的介绍
  8. MySQL索引的一些问题
  9. 电脑磁盘清理_软件 | 功能强大的电脑磁盘清理工具中文优化版,有了它,你的电脑就像德芙巧克力一般丝滑...
  10. centos6.0的gnome桌面的一个大bug
  11. 检查压缩包是否损坏_工业脉冲布袋除尘器安装前的检查工作
  12. (转)Uncaught TypeError: Cannot set property 'innerHTML' of null
  13. 北大计算机学硕几年,我的OI经历 --张正超(深学教育资深教练、北大计算机系研究生)...
  14. 软件项目管理第十章笔记---项目采购管理
  15. 十大排序算法——C语言实现
  16. 基于Booth算法的64位浮点乘法器的实现
  17. Marlin固件 ---- G_Code 命令解析
  18. java工程源码看不懂_目前从事java开发工作,看不懂源码应该怎么做?
  19. 【导数术】4.三次函数
  20. 怎样申请MAC地址?

热门文章

  1. 洛谷 P1073 最优贸易
  2. Heroku部署vue项目失败:sh: 1: vue-cli-service: not found
  3. “虚拟教练”,运动员必备
  4. 深思iOS应用加固方案
  5. 罗格宣布:俄罗斯索契赢得2014年冬奥会举办权
  6. 西门子串口通讯10-CP441-2在STEP7环境中做Modbus从站通讯
  7. 【电商经验】之商品下单减库存方案
  8. TypeScript基本类型总结
  9. admin ui html,H-ui Admin 后台
  10. 通过抓包看quic定义的包结构