848. Shifting Letters

We have a string S of lowercase letters, and an integer array shifts.

Call the shift of a letter, the next letter in the alphabet, (wrapping around so that 'z' becomes 'a'). 

For example, shift('a') = 'b', shift('t') = 'u', and shift('z') = 'a'.

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.

Example 1:

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:

  1. 1 <= S.length = shifts.length <= 20000
  2. 0 <= shifts[i] <= 10 ^ 9

Rust Solution

struct Solution;

impl Solution {
    fn shifting_letters(s: String, shifts: Vec<i32>) -> String {
        let n = s.len();
        let mut s: Vec<char> = s.chars().collect();
        let mut prev: u8 = 0;
        for i in (0..n).rev() {
            prev += (shifts[i] % 26) as u8;
            prev %= 26;
            s[i] = (b'a' + (s[i] as u8 - b'a' + prev) % 26) as char;
        }
        s.into_iter().collect()
    }
}

#[test]
fn test() {
    let s = "abc".to_string();
    let shifts = vec![3, 5, 9];
    let res = "rpl".to_string();
    assert_eq!(Solution::shifting_letters(s, shifts), res);
}

Having problems with this solution? Click here to submit an issue on github.