題目連結:
題目意譯:
你被給定一個由小寫英文字母組成的字串 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。
最後只要掃過每一個位置,然後先檢查該位置有沒有事件的端點出現。有的話就把相應位移量加到「當前位移量」上。然後把現在看到的字母根據「當前位移量」去位移即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。