# 【LeetCode】 Perform String Shifts ## Description > You are given a string `s` containing lowercase English letters, and a matrix `shift`, where `shift[i] = [direction, amount]`: > * `direction` can be `0` (for left shift) or `1` (for right shift). > * `amount` is the amount by which string `s` is to be shifted. > * A left shift by 1 means remove the first character of `s` and append it to the end. > * Similarly, a right shift by 1 means remove the last character of `s` and add it to the beginning. > Return the final string after all operations. > Constraints: > * `1 <= s.length <= 100` > * `s` only contains lower case English letters. > * `1 <= shift.length <= 100` > * `shift[i].length == 2` > * `0 <= shift[i][0] <= 1` > * `0 <= shift[i][1] <= 100` > 給你一個字串`s`包含小寫英文字母,和一個矩陣 `shift`,結構為`shift[i] = [方向, 大小]`: > * `方向`可以是`0`(往左移)或是`1`(往右移)。 > * `大小`代表字串`s`要位移的量。 > * 往左移1代表去掉`s`的第一個字母並把它加到最後面。 > * 以此類推,往右移1代表去掉`s`的最後一個字母並把他加到最前面。 > 回傳最後運算完的字串。 > 限制: > * `1 <= s.length <= 100` > * `s` 只會包含小寫英文字母。 > * `1 <= shift.length <= 100` > * `shift[i].length == 2` > * `0 <= shift[i][0] <= 1` > * `0 <= shift[i][1] <= 100` ## Example: ``` Example 1: Input: s = "abc", shift = [[0,1],[1,2]] Output: "cab" Explanation: [0,1] means shift to left by 1. "abc" -> "bca" [1,2] means shift to right by 2. "bca" -> "cab" Example 2: Input: s = "abcdefg", shift = [[1,1],[1,1],[0,2],[1,3]] Output: "efgabcd" Explanation: [1,1] means shift to right by 1. "abcdefg" -> "gabcdef" [1,1] means shift to right by 1. "gabcdef" -> "fgabcde" [0,2] means shift to left by 2. "fgabcde" -> "abcdefg" [1,3] means shift to right by 3. "abcdefg" -> "efgabcd" ``` ## Solution * 移過去在移回來可以抵銷,因此不要傻傻地每個`shift`都移動,請先算完最後要移動多少,動一次就好。 * 位移的部分,我直接根據原字串重建一個新的字串。 * 先找到第一個應該加入的字母,然後用`%`加一圈回來。 * 中間使用`while`讓`count`必定為正數。 ### Code ```C++=1 class Solution { public: string stringShift(string s, vector<vector<int>>& shift) { int count = 0; int str_s = s.size(); string ans; for(int i = 0; i < shift.size(); i++) { if(shift[i][0]) count -= shift[i][1]; else count += shift[i][1]; } while(count < 0) count += str_s; for(int i = 0; i < str_s; i++) ans += s[(count + i) % str_s]; return ans; } }; ``` ###### tags: `LeetCode` `C++`