地址 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 的字符串長度取值範圍均爲 1 至 100; 兩個字符串中都只有小寫字符,而且都可能存在重複字符; 字符串 key 必定能夠由字符串 ring 旋轉拼出。
暴力每次DFS 嘗試每次找到合適字母的各類扭法 無剪枝 結果TLE了blog
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); } };
代碼 todo遊戲