leetcode514 自由之路

2022-07-15 12:27:16 字數 1774 閱讀 6372

最初,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。

著作權歸領扣網路所有。

class solution 

};

從loc1旋轉到loc2

可以順時針旋轉,也可以逆時針旋轉

選取其中較小的,再用一步拼寫,即為所需步數

int getdis(int loc1,int loc2,int n)
int m = key.size();

int n = ring.size();

int dp[m][n];

memset(dp,0,sizeof(dp));

dp[i][j]

當ring[j]!=key[i]時為0,

當ring[j]==key[i]時找到key[0:i]的步數

一開始初始化為全零

for(int j = 0;j < n;++j)
第一次旋轉,getdis(loc1,loc2,n)中loc1 = 0

for(int i = 1;i < m;++i)}}

其中狀態轉移方程為

dp[i][j] = dp[i][j] == 0 ? (dp[i-1][k]+getdis(k,j,n)) : min(dp[i-1][k]+getdis(k,j,n),dp[i][j]);

直觀上,每次旋轉,dp[i][j]是

由前面i-1次旋轉需要的步數dp[i-1][k]

加上這次旋轉所需步數getdis(k,j,n)

中的最小值

int result = int_max;

for(int j = 0;j < n;++j)return result;

class solution 

int findrotatesteps(string ring, string key)

//繼續旋轉

for(int i = 1;i < m;++i)}}

//獲取最小步數並返回

int result = int_max;

for(int j = 0;j < n;++j)return result;}};

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 ...

514 自由之路

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

514 自由之路

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