AtCoder232 B
以下のコードはAtCoder過去問232のB問題公式解説です。
//s2[i] = ((s2[i]-'a')+k)%26 + 'a';//
この部分が理解できません
kはintegerでなぜ文字列s2などの(s2[i]-'a')と足せるのか、-'a'と+'a'の違いがなんなのか。調べてもよくわからなかったので、どなたか解説お願いします。
問題文
高橋君は英小文字からなる文字列 S を持っています。
高橋君は文字列 S に対して、下記の操作をちょうど 1 回行います。
まず、非負整数 K を選ぶ。
その後、S の各文字を K 個後ろの英小文字に変更する。
ただし、
a の 1 個後ろの英小文字は b であり、
b の 1 個後ろの英小文字は c であり、
c の 1 個後ろの英小文字は d であり、
⋯
y の 1 個後ろの英小文字は z であり、
z の 1 個後ろの英小文字は a です。
例えば、b の 4 個後ろの英小文字は f であり、y の 3 個後ろの英小文字は b です。
文字列 T が与えられます。 高橋君が上記の操作によって S を T に一致させることができるかを判定してください。
制約
S と T はそれぞれ英小文字からなる長さ 1 以上 10
5
以下の文字列
S の長さと T の長さは等しい
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string s, t;
cin >> s >> t;
for(int k = 0; k <= 25; k++){
string s2 = s;
for(int i = 0; i < (int)s.size(); i++){
s2[i] = ((s2[i]-'a')+k)%26 + 'a'; //わからない
}
if(s2 == t){
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}