leetcode:514. 自由之路
题目来源
- 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. 自由之路相关推荐
- LeetCode 514. 自由之路(记忆化递归 / DP)
文章目录 1. 题目 2. 解题 1. 题目 电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring" ...
- 【Leetcode 每日一题】514. 自由之路(BFS+优先队列)
Leetcode 每日一题 题目链接:514. 自由之路 难度: 困难 解题思路: 这道题乍一看,可以选择用动态规划或者BFS来求解.本文使用BFS来进行解答.注意到题中有一个最小的到路径.所以我们可 ...
- 【LeetCode】自由之路 [H](记忆化搜索)
514. 自由之路 - 力扣(LeetCode) 一.题目 电子游戏"辐射4"中,任务 "通向自由" 要求玩家到达名为 "Freedom Trail ...
- leetcode 动态规划 514. 自由之路
电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写特定关键词才能开门. ...
- leetcode【每日一题】514. 自由之路 Java【待完成
题干 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写特定关键词才能 ...
- leecode 514. 自由之路
题目描述 电子游戏"辐射4"中,任务 "通向自由" 要求玩家到达名为 "Freedom Trail Ring" 的金属表盘,并使用表盘拼写特 ...
- LeetCode_514_自由之路
题目:自由之路 难度:困难 514.自由之路 电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring" ...
- 卖萌屋算法岗面试手册上线!通往面试自由之路
一只小狐狸带你解锁 炼丹术&NLP 秘籍 作为算法工程师,基础知识的重要性自然不必多说.虽然在有些项目中比较难感受到基础的作用,但扎实的coding能力,对算法本质和适用情况的理解,始终是决定 ...
- 订阅了李笑来的“通往财富自由之路”栏目
早晨醒来看"学习学习再学习"公众号,发现李笑来在"得到"应用上推出了付费订阅栏目"财富自由之路",199元/年. 思考了几分钟之后,还是决定 ...
最新文章
- goland 配置goroot找不到SDK
- 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
- 【Tools】CSDN-markdown编辑器使用说明
- Android 6.0 超级简单的权限申请2 (Permission)
- typeof 数据类型转换
- DrawArc绘制弧线
- jstl版本的jar下载?
- 惠普计算机硬盘序列号怎么查询,硬盘序列号怎么看
【设置办法】
- 今天第一次来这里开博,大家多多指教
- 网记者采访时,一直称李某萍为“妻子”
- 深度学习笔记(50) 一维到三维推广
- 短距离无线通信设备的天线设计
- win10动态壁纸怎么设置_动态壁纸怎么设置,试试这款应用
- 程序员,被代码耽误的段子手!
- 爬取优美图库里的照片,并存到文件夹中
- Photoshop制作逼真燃烧的文字效果
- u深度做linux启动盘,u深度u盘启动盘制作教程
- 《鲸鱼安慰了大海》精选篇章
- html 控制横向打印机,hp LaserJet 1000打印机怎么设置实现横向打印?
- confluence 删除_知识管理平台Confluence教程:如何删除或还原页面?