前往
大廳
主題

LeetCode - 0514. Freedom Trail 解題心得

Not In My Back Yard | 2024-05-03 12:00:01 | 巴幣 0 | 人氣 26

題目連結:


題目意譯:
在電子遊戲「異塵餘生 4」(Fallout 4)中,在任務「Road To Freedom」中需要玩家抵達一個名為 "Freedom Trail Ring" 的金屬轉盤前面,並使用該轉盤拼出一個特定關鍵字詞來開門。

給定一個代表著銘刻在轉盤外緣上的密碼之字串 ring 以及另一個代表著你需要拼湊出來的關鍵字詞之字串 key,回傳拼出關鍵字詞所需的最少步數。

在最一開始,ring 的第一個字母將會對齊於十二點鐘方向。你需要藉由順時針或逆時針地旋轉圓盤並使得字元對齊十二點鐘方向並按下圓盤中間的按鈕來一一拼出 key 中的字元。

在旋轉圓盤要拼出 key 中的字元 key[i] 時:
    1. 你可以藉由順時針或逆時針旋轉 ring 一個位置,而這會算作「一步」。這個動作的最終目的是要把 ring 的某個字元對齊十二點鐘方向,而該字元應為 key[i]。
    2. 如果字元 key[i] 已經對齊到十二點鐘方向了,則你須按下中間的按鈕來拼出這個字元,而其也會被算作「一步」。按完按鈕後,你可以開始拼出 key 中的下一個字元。如果沒有下一個,則代表你拼完全部字元了。

限制:
1 ≦ ring.length, key.length ≦ 100
ring 和 key 只由小寫英文字母組成。
保證 key 可以藉由旋轉字串 ring 而拼出來。



範例測資:
範例 1:
輸入: ring = "godding", key = "gd"
輸出: 4
解釋:
對於第一個關鍵字元 'g',由於其已經就定位,因此我們只需要 1 步便可以拼出此字元。
對於第二個關鍵字元 'd',我們需要逆時針旋轉字串 "godding" 兩個位置來使其變為 "ddinggo"。
而我們需要再 1 步來拼出這個字元。
所以最終輸出為 4。

範例 2:
輸入: ring = "godding", key = "godding"
輸出: 13


解題思維:
(令 K = key.length 、 R = ring.length)
可以看到按按鈕的次數是固定的,即 K 次。所以我們可以最後再考慮這邊的步數。

接著我們定義一個二維陣列 D,其中 D[i][j] 代表著在拼出 key 的前 i 個字元的情況下轉盤結束於 ring[j] 的最少步數。可以看到其遞迴式為:
    D[0][0] = 0;
    (上式為遞迴停止條件)
    D[i][j] = min(D[i - 1][k] + S(j, k)),其中 i > 0 、 0 ≦ j, k < R、 key[i - 1] == ring[j] 且 S(j, k) 代表著從 ring[j] 轉到 ring[k] 所需的最少步數。
    反之,D[i][j] = 無限大(避免拼出 key[i + 1] 時轉盤轉了多餘的次數)。

而可以看到轉盤要從 ring[j] 轉到 ring[k] 只有兩種可能最佳策略,一個是順時針直接轉到定位;另一個則是逆時針直接轉到定位。因此可以看到 S(j, k) = min(|j - k|, R - |j - k|)。

而最後取 D[K][0] 、 D[K][1] 、 …… 、 D[K][R - 1] 中的最小值加上 K 即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作