网站建设费用:做个网站要多少钱?,主机屋免费服务器,养生网站策划,爱心互助网站开发514. 自由之路
题目描述#xff1a;
电子游戏“辐射4”中#xff0c;任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘#xff0c;并使用表盘拼写特定关键词才能开门。
给定一个字符串 ring #xff0c;表示刻在外环上的编码#xff1b;给定另一…514. 自由之路
题目描述
电子游戏“辐射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 的下一个字符下一阶段, 直至完成所有拼写。
示例1 输入: ring godding, key gd
输出: 4
解释:对于 key 的第一个字符 g已经在正确的位置, 我们只需要1步来拼写这个字符。 对于 key 的第二个字符 d我们需要逆时针旋转 ring godding 2步使它变成 ddinggo。当然, 我们还需要1步进行拼写。因此最终的输出是 4。 示例 2: 输入: ring godding, key godding
输出: 13提示 1 ring.length, key.length 100ring 和 key 只包含小写英文字母保证 字符串 key 一定可以由字符串 ring 旋转拼出 思路
动态规划大神思路在代码区
代码
cv 的大佬Ikaruga的代码
class Solution {
public:int findRotateSteps(string ring, string key) {vectorint pos[26];//记录ring里每个字符都在哪 godding里是 g在 0 6 d在 2 3for (int i 0; i ring.size(); i) {pos[ring[i] - a].push_back(i);}vectorvectorint dp(key.size(), vectorint(ring.size(), INT_MAX));//dp[i][j]的定义 在匹配key中第i个字母的时候使用ring中第j个位置所需要的操作。for (int i 0; i key.size(); i) {for (auto j : pos[key[i] - a]) {//j是key[i] 在环内的位置if (i 0) {//key的第一个字母 不需要考虑任何前面的次数//只需要计算 指针从0 转到 j 的操作次数 再加上 1 选择当前 就是总操作数dp[i][j] min(dp[i][j], 0 clac(ring.size(), 0, j) 1);continue;}//当i非0的时候 需要看一下之前字母的操作次数//k 就是前一个字母的位置for (auto k : pos[key[i - 1] - a]) {//非第一个的字母 需要看一下从前面的字母怎么转移来是操作数最小的。//比如那个老哥给的例子dp[0][1] 2, dp[0][8] 3,//然后匹配第二个字母的时候dp[1][3] min(dp[0][1] 从1转到3 1, dp[0][8] 从 8 转到3 1)dp[i][j] min(dp[i][j], dp[i - 1][k] clac(ring.size(), k, j) 1);}}}return *min_element(dp.back().begin(), dp.back().end());}//计算从 指针在a 到 字母所在位置b 最少需要转多少次int clac(int len, int a, int b) {return min((len a - b) % len, (len b - a) % len);}
};
参考循环队列的出入队以及求队长的操作可以得到从某一位置到另一位置的最近步数 min((len a - b) % len, (len b - a) % len);
再来一个Python
class Solution:def findRotateSteps(self, ring: str, key: str) - int:#先用一个哈希表存放ring中各个字母的索引hs dict()for i in range(len(ring)):if ring[i] not in hs:hs[ring[i]] [i]else:hs[ring[i]].append(i)#初始化dp数组包括初始化第一行m,n len(ring),len(key)dp [float(inf)]*mfor q in hs[key[0]]:dp[q] min(q,m-q)1for i in range(1,n):#分为两种情况1.正在处理的字母与上一个字母不同2.正在处理的字母与上一个字母相同if key[i]!key[i-1]:for p in hs[key[i-1]]:for j in hs[key[i]]:dp[j] min(dp[j],min(abs(j-p),m-abs(j-p))dp[p]1)dp[p] float(inf)else:for j in hs[key[i]]:# tmp float(inf)# for p in hs[key[i-1]]:# tmp min(tmp,min(abs(j-p),m-abs(j-p))dp[p]1)# dp[j] tmpdp[j]1return min(dp)