LeetCode 自由之路(動態規劃 回溯法)

2021-09-16 22:57:04 字數 2677 閱讀 5350

輸入: ring = "godding", key = "gd"

輸出: 4

解釋: 對於 key 的第乙個字元 'g',已經在正確的位置, 我們只需要1步來拼寫這個字元。

對於 key 的第二個字元 'd',我們需要逆時針旋轉 ring "godding" 2步使它變成 "ddinggo"。

當然, 我們還需要1步進行拼寫。

因此最終的輸出是 4。

ring 和 key 的字串長度取值範圍均為 1 至 100;

兩個字串中都只有小寫字元,並且均可能存在重複字元;

字串 key 一定可以由字串 ring 旋轉拼出。

思路分析:該開始,想著回溯法,就是每次將key[index]尋找ring[nextlocation],從nowlocation到達nextlocation有順時針、逆時針兩種轉法,每次選擇最小值。一直搜尋,知道拼寫除了key。

class

solution

dfs(ringch, ring, key,0,

0,0)

;//開始搜尋

return minres;

}//nowindex是即將拼寫的key中的下標,nowsteps到達此時的步驟數,nowlocation現在所處的下標

回溯法,沒有找到高效的剪枝就tm是暴搜。。。

方法二:動態規劃法。

二維陣列dp,其中dp[i][j]表示轉動從i位置開始的key串所需要的最少步數(這裡不包括spell的步數,因為spell可以在最後統一加上),此時表盤的12點位置是ring中的第j個字元。我們可以從key的末尾往前推,這樣dp[0][0]就是我們所需要的結果,因為此時是從key的開頭開始轉動,而且表盤此時的12點位置也是ring的第乙個字元。

現在我們來看如何找出遞推公式,對於dp[i][j],我們知道此時要將key[i]轉動到12點的位置,而此時表盤的12點位置是ring[j],我們有兩種旋轉的方式,順時針和逆時針,我們的目標肯定是要求最小的轉動步數,而順時針和逆時針的轉動次數之和剛好為ring的長度n,這樣我們求出來乙個方向的次數,就可以迅速得到反方向的轉動次數。

為了將此時表盤上12點位置上的ring[j]轉動到key[i],我們要將表盤轉動一整圈,當轉到key[i]的位置時,我們計算出轉動步數diff,然後計算出反向轉動步數,並取二者較小值為整個轉動步數step,此時我們更新dp[i] [j],更新對比值為step + dp[i+1][k], 這個也不難理解,因為key的前乙個字元key[i+1]的轉動情況suppose已經計算好了,那麼dp[i+1][k]就是當時表盤12點位置上ring[k]的情況的最短步數,step就是從ring[k]轉到ring[j]的步數,也就是key[i]轉到ring[j]的步數,

用語言來描述就是,從key的i位置開始轉動並且此時表盤12點位置為ring[j]的最小步數(dp[i][j])就等價於將ring[k]轉動到12點位置的步數(step)加上從key的i+1位置開始轉動並且ring[k]已經在表盤12點位置上的最小步數(dp[i+1][k])之和。

class

solution}}

}return dp[0]

[0]+ m;

//最後的m是key單詞拼寫次數}}

方法二:帶備忘錄的回溯法。(思路和沒有通過的回溯法一致)

class

solution

return

helper

(ring, key,0,

0, v, memo);}

inthelper

(string ring, string key,

int x,

int y, vector

int>

>

&v, vector

int>

>

& memo)

int res = int_max, n = ring.

size()

;//搜尋從ring[x]的位置轉到字元key[y]的位置需要的轉動次數

leetcode 自由之路

leetcode每日一題 這應該就是個廣度優先搜尋的實現,具體操作方法就是每次找到下一步的能到達的所有點,因為有重合,可以篩選一部分 我可能寫的比較亂,也可能有其他解決方法,但是我有點懶了 public intfindrotatesteps string ring,string key 開始遍歷ke...

leetCode 514 自由之路

題目 狀態設定 dp i pos 在第i輪,將字元ring pos 移動到12點位置,拼寫key 0 i 所需要的最小步數 狀態計算 dp i pos min dp i pos dp i 1 prepos min abs prepos pos m abs prepos pos for prepos ...

leetcode514 自由之路

最初,ring 的第乙個字元與12 00方向對齊。您需要順時針或逆時針旋轉 ring 以使 key 的乙個字元在 12 00 方向對齊,然後按下中心按鈕,以此逐個拼寫完 key 中的所有字元。旋轉 ring 拼出 key 字元 key i 的階段中 您可以將 ring 順時針或逆時針旋轉乙個位置,計...