소문자로 된 문자열 S가 있고 정수 배열이 이동한다고 가정합니다. 문자의 이동은 알파벳의 다음 문자를 의미하며 z의 경우 다음 문자가 됩니다. 이제 각 shift[i] =x에 대해 S의 첫 번째 i+1 문자를 x번 이동하려고 합니다. S에 대한 이러한 모든 이동이 적용된 후 최종 문자열을 찾아야 합니다. 따라서 문자열이 "abc"이고 shifts =[3,5,9]이면 S의 처음 1자를 3만큼 이동한 후 "dbc"가 되고 S의 처음 두 글자를 5만큼 이동하면 "igc ", 그리고 S의 처음 세 글자를 9로 옮기면 "rpl"이 나오는데 이것이 답입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 시프트 배열의 범위 크기에 있는 i의 경우 – 2에서 0까지
- shift[i] :=shift[i] + shift[i + 1]
- shift[i] :=shift[i] 모드 26
- 0부터 S – 1까지의 범위에 있는 i의 경우
- S[i] :=((S[i] – a의 ASCII) + shifts[i] mod 26) + a의 ASCII
- 반환 S
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: string shiftingLetters(string S, vector<int>& shifts) { for(int i = shifts.size() - 2 ;i >=0; i--){ shifts[i] += shifts[i + 1]; shifts[i] %= 26; } for(int i = 0; i < S.size(); i++) { S[i] = ( ((S[i] - 'a') + shifts[i]) % 26 + 'a'); } return S; } }; main(){ vector<int> v = {3,5,9}; Solution ob; cout << (ob.shiftingLetters("abc", v)); }
입력
"abc" [3,5,9]
출력
rpl