We have a string S
of lowercase letters, and an integer array shifts
.html
Call the shift of a letter, the next letter in the alphabet, (wrapping around so that 'z'
becomes 'a'
). git
For example, shift('a') = 'b'
, shift('t') = 'u'
, and shift('z') = 'a'
.github
Now for each shifts[i] = x
, we want to shift the first i+1
letters of S
, x
times.數組
Return the final string after all such shifts to S
are applied.app
Example 1:spa
Input: S = "abc", shifts = [3,5,9] Output: "rpl" Explanation: We start with "abc". After shifting the first 1 letters of S by 3, we have "dbc". After shifting the first 2 letters of S by 5, we have "igc". After shifting the first 3 letters of S by 9, we have "rpl", the answer.
Note:code
1 <= S.length = shifts.length <= 20000
0 <= shifts[i] <= 10 ^ 9
這道題讓咱們對字母進行漂移,給了一個 shifts 數組,裏面是對應對須要漂移值,可是須要注意的是,shifts[i] 表示對於原字符串 [0, i] 範圍內的全部的字符都進行 shifts[i] 的漂移,那麼實際上第一個字母其實把 shifts 數組全部的數字都漂移了一遍,而第二個字母則是把 shifts 數組從第二個數字開始到最後的全部數字都漂移了,而最後一個字母就只漂移了最後一個數字。這不就是一個反向累加和數組麼,只要創建了反向累加和數組,那麼每一個位子上的數字就是對應的字母的漂移值了。爲了節省空間,咱們就不另建數組了,直接在 shifts 數組上累加就好了,注意累加值要對 26 取餘,由於累加和數組可能會整型溢出,取餘後就不會有這個問題,並且因爲字母漂移 2 6次後,都會回到原來的位置,因此對 26 取餘並不會影響到最後的結果。htm
反向累加和數組創建好了以後,就要開始對字母進行漂移了,這裏還有個須要注意的地方,不能直接用原字母加上漂移值,由於一旦超過了 'z' 的時候,是須要從 'a' 從新的開始的,爲了處理全部的狀況,可使用一個很經常使用的 trick,就是先算出字母到 'a' 之間的距離,而後加上漂移值,再對 26 取餘,這就是漂移後與 'a' 的距離了,再加上 'a' 變成字母便可,參見代碼以下:blog
class Solution { public: string shiftingLetters(string S, vector<int>& shifts) { for (int i = (int)shifts.size() - 2; i >= 0; --i) { shifts[i] = (shifts[i] + shifts[i + 1]) % 26; } for (int i = 0; i < shifts.size(); ++i) { S[i] = (S[i] - 'a' + shifts[i]) % 26 + 'a'; } return S; } };
Github 同步地址:leetcode
https://github.com/grandyang/leetcode/issues/848
參考資料:
https://leetcode.com/problems/shifting-letters/
https://leetcode.com/problems/shifting-letters/discuss/137906/C%2B%2BJavaPython-Easy-Understood