ETH官方钱包

前往
大廳
主題

LeetCode - 2381. Shifting Letters II 解題心得

Not In My Back Yard | 2023-07-11 20:00:11 | 巴幣 0 | 人氣 98

題目連結:


題目意譯:
你被給定一個由小寫英文字母組成的字串 s 以及一個二維整數陣列 shifts,其中 shifts[i] = [starti, endi, directioni]。對於每個 i 值,如果 directioni = 1,則將 s 中從索引值 starti 到索引值 endi 的字母全部「向前位移」;而如果 directioni = 0,則將這些字母「向後位移」。

把一個字母「向前位移」代表著將它替換成字母表中的下一個字母(字母表頭尾相鄰,也就是說 'z' 將變成 'a')。相似地,將一個字母「向後位移」代表著它替換成字母表中上一個字母(字母表頭尾相鄰,也就是說 'a' 將變成 'z')。

回傳所有的位移都執行於 s 之後所得的最終字串。

限制:
1 ≦ s.length, shifts.length ≦ 5 × 10 ^ 4
shifts[i].length == 3
0 ≦ starti ≦ endi < s.length
0 ≦ directioni ≦ 1
s 由小寫英文字母組成。



範例測資:
範例 1:
輸入: s = "abc", shifts = [[0,1,0],[1,2,1],[0,2,1]]
輸出: "ace"
解釋: 首先,將索引值 0 到索引值 1 的字母向後位移。現在 s = "zac"。
接著,將索引值 1 到索引值 2 的字母向後位移。現在 s = "zbd"。
最後,將索引值 0 到索引值 2 的字母向後位移。現在 s = "ace"。

範例 2:
輸入: s = "dztz", shifts = [[0,0,0],[1,1,1]]
輸出: "catz"
解釋: 首先,將索引值 0 到索引值 0 的字母向後位移。現在 s = "cztz"。
最後,將索引值 1 到索引值 1 的字母向後位移。現在 s = "catz"。


解題思維:
其實跟這題很類似,只是我們現在只剩下類似於花朵開花、花朵謝了的「位移量 + 1」和「位移量 -1」。同時我們也可以把 s 的每一個字母看做是每一個時間點都有一個人到達。

因此接著只要按照典型的掃描線演算法(Sweep Line Algorithm)作法,把 shifts 的事件分拆成兩個端點:一個是位移量 + 1(或 -1),位置在 shifts[i][0];另一個是位移量 - 1(或 + 1),位置在 shifts[i][1] + 1。

最後只要掃過每一個位置,然後先檢查該位置有沒有事件的端點出現。有的話就把相應位移量加到「當前位移量」上。然後把現在看到的字母根據「當前位移量」去位移即可。




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

創作回應

更多創作