码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 514 自由之路

时间:2019-08-03 21:42:10      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:表示   剪枝   ota   https   字符串   一个   break   解释   ble   

地址  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

Leetcode 514 自由之路

标签:表示   剪枝   ota   https   字符串   一个   break   解释   ble   

原文地址:https://www.cnblogs.com/itdef/p/11296180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!