LeetCode 514. 自由之路(记忆化递归 / DP)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 514. 自由之路(记忆化递归 / DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
1. 題目
電子游戲“輻射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 的下一個字符(下一階段), 直至完成所有拼寫。
示例:
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/freedom-trail
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 直接暴力dfs搜索,超時
48 ms 25.4 MB
class Solution { //DP public:int findRotateSteps(string ring, string key) {int n = ring.size();vector<vector<int>> pos(26);vector<vector<int>> dp(101, vector<int>(101, INT_MAX));for(int i = 0; i < ring.size(); i++)pos[ring[i]-'a'].push_back(i);for(int i = 0; i < key.size(); ++i){for(int j = 0; j < pos[key[i]-'a'].size(); j++){if(i == 0){int delta = min(pos[key[i]-'a'][j], n-pos[key[i]-'a'][j]);dp[i][j] = min(dp[i][j], delta+1);}else{for(int k = 0; k < pos[key[i-1]-'a'].size(); k++){ //上一個字符的狀態int delta = min(abs(pos[key[i-1]-'a'][k]-pos[key[i]-'a'][j]), n-abs(pos[key[i-1]-'a'][k]-pos[key[i]-'a'][j]));dp[i][j] = min(dp[i][j], dp[i-1][k]+delta+1);}}}}int len = key.size();return *min_element(dp[len-1].begin(), dp[len-1].end());} };40 ms 25.3 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 514. 自由之路(记忆化递归 / DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云 超级码力在线编程大赛初赛 第2场
- 下一篇: LeetCode 555. 分割连接字符