Leetcode 514 自由之路

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

題目描述

視頻遊戲「輻射4」中,任務「通向自由」要求玩家到達名爲「Freedom Trail Ring」的金屬錶盤,並使用錶盤拼寫特定關鍵詞才能開門。dom

給定一個字符串 ring,表示刻在外環上的編碼;給定另外一個字符串 key,表示須要拼寫的關鍵詞。您須要算出可以拼寫關鍵詞中全部字符的最少步數。編碼

最初,ring 的第一個字符與12:00方向對齊。您須要順時針或逆時針旋轉 ring 以使 key 的一個字符在 12:00 方向對齊,而後按下中心按鈕,以此逐個拼寫完 key 中的全部字符。spa

旋轉 ring 拼出 key 字符 key[i] 的階段中:code

您能夠將 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了blog

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遊戲

相關文章
相關標籤/搜索