Leetcode 514 自由之路

地址  https://leetcode-cn.com/problems/freedom-trail/

题目描述

视频游戏“辐射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 的下一个字符(下一阶段), 直至完成所有拼写。

样例

复制代码
输入: ring = "godding", key = "gd"
输出: 4
解释:
 对于 key 的第一个字符 'g',已经在正确的位置, 我们只需要1步来拼写这个字符。 
 对于 key 的第二个字符 'd',我们需要逆时针旋转 ring "godding" 2步使它变成 "ddinggo"。
 当然, 我们还需要1步进行拼写。
 因此最终的输出是 4。

提示:

ring 和 key 的字符串长度取值范围均为 1100;
两个字符串中都只有小写字符,并且均可能存在重复字符;
字符串 key 一定可以由字符串 ring 旋转拼出。
复制代码

算法1

(暴力DFS)

暴力每次DFS 尝试每次找到合适字母的各种扭法 无剪枝 结果TLE了

C++ 代码

复制代码
class Solution {
public:



int dfs(const string& ring, const string& key, int currStridx, int keyidx, int stepCount)
{
    int ret = 99999;
    if (keyidx == key.size())
        return stepCount;

    for (int i = currStridx; i < ring.size() + currStridx; i++) {
        if (ring[i] == key[keyidx]){
            int addStep = min( (i- currStridx), int(currStridx+ ring.size()-i) );
            i = i % (ring.size()/3) + (ring.size()/3);
            ret = min(ret, dfs(ring, key, i, keyidx + 1, stepCount + 1 + addStep));
            break;
        }
    }

    for (int i = currStridx; i >=0 ; i--) {
        if (ring[i] == key[keyidx]) {
            int addStep = min((currStridx - i),int (ring.size() +i- currStridx ) );
            i = i % (ring.size() / 3) + (ring.size() / 3);
            ret = min(ret, dfs(ring, key, i, keyidx + 1, stepCount + 1+ addStep));
            break;
        }
    }


    return ret;
}



int findRotateSteps(string ring, string key) {
    if (key.empty())  return 0;
    string s = ring;
    s += ring;
    s += ring;
    return dfs(s, key, ring.size(), 0, 0);
}



};
复制代码

算法2

DP

代码 todo

posted on   itdef  阅读(284)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示