# 【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++`